2013-03-20 11 views
5

Najprawdopodobniej raczej banalne pytanie, ale czy blok zakończenia będzie zawsze wywoływany przy użyciu [NSURLConnection sendAsynchronousRequest: ...]? LUB czy muszę wprowadzić zegar czasu oczekiwania?Czy [NSURLConnection sendAsynchronousRequest: ...] zawsze wysyła blok zakończenia?

Rozważmy następujący gdzie mogę dodać MBProgressView przed wywołaniem i usunąć go tylko w tym bloku realizacji:

[self showHUDWithTitle:@"Configuring"]; 
[NSURLConnection sendAsynchronousRequest:request 
            queue:[[NSOperationQueue alloc] init] 
         completionHandler:^(NSURLResponse *response, 
              NSData *data, 
              NSError *error) { 

    if ([data length] >0 && error == nil) { 
     [self hideHUDWithFlag:YES 
         andTitle:@"Finished" 
        andSubtitle:@"(Box was configured)"]; 

    } else if ([data length] == 0 && error == nil) { 
     [self hideHUDWithFlag:NO 
         andTitle:@"Failed" 
        andSubtitle:@"(Check box connection)"]; 
     NSLog(@"Nothing was downloaded."); 

    } else if (error != nil) { 
     [self hideHUDWithFlag:NO 
        andTitle:@"Error" 
        andSubtitle:@"(Check box connection)"]; 
     NSLog(@"Error = %@", error); 
    } 
}]; 
+0

naturalny. procedura obsługi zakończenia to program obsługi COMPLETION - nie jest to program do obsługi sukcesu: D –

+0

@ Daij-Djan Jestem handlarzem zakończonym sukcesem, a nie wykonawcą, który dokończył ukończenie! – Groot

+1

jeśli (! Błąd) = sukces: D –

Odpowiedz

15

Tak, obsługa zakończenia jest zawsze wywoływana. Jeśli żądanie nie powiedzie się z powodu przekroczenia limitu czasu, zostanie ustawiony error i data = nil.

Domyślny limit czasu to 60 sekund, ale przed rozpoczęciem połączenia można przypisać inną wartość do request.timeoutInverval. Nie ma więc potrzeby dodatkowego zegara.

Dodano: W przypadku timeout:

  • [error domain] jest NSURLErrorDomain i
  • [error code] jest NSURLErrorTimedOut,

Jeśli chcesz po prostu przedstawić komunikat o błędzie, można użyć [error localizedDescription], co oznacza "Upłynął limit czasu żądania." w tym przypadku. (Może to zależeć od lokalizacji.)

+0

Świetna odpowiedź, dzięki! – Groot

+0

@Filip: Nie ma za co. Dodałem kilka informacji, w jaki sposób można sprawdzić limit czasu. –

0

[NSURLConnection sendAsynchronousRequest ...] z pewnością nazwać blok ukończeniu w każdym scenariuszu. Jednak jeśli chcesz ograniczyć ten proces do maksymalnego czasu, możesz również użyć timera limitu czasu.

Aby wyświetlić pasek postępu, w jaki sposób zwiększysz wartość? Zamiast paska postępu sugerowałbym, abyś podszedł do wskaźnika aktywności.

Mam nadzieję, że to pomoże.

2
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url 
               cachePolicy:NSURLCacheStorageAllowed    
              timeoutInterval:20]; 
+2

Proszę wyjaśnić, co zrobiłeś i dlaczego. Ludzie rzadko uczą się na podstawie odpowiedzi tylko kodu. – Jasper