2013-03-20 10 views
5

Wahrscheinlich eine eher triviale Frage aber wird der Abschluss Block immer mit [NSURLConnection sendAsynchronousRequest: ...] genannt werden? ODER muss ich einen Timeout-Timer implementieren?Will [NSURLConnection sendAsynchronousRequest: ...] immer Fertigstellung Block schicken?

Betrachten Sie das folgende, wo ich einen MBProgressView vor dem Anruf hinzufügen und sie nur im Abschluss Block entfernen:

[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

natürlich. Ein Completion-Handler ist ein COMPLETION-Handler - kein Erfolgs-Handler: D –

+0

@ Daij-Djan Ich bin der Erfolgs-Handler, nicht der Completer, der die Vervollständigung abschließt! – Groot

+1

if (Fehler!) = Erfolg: D –

Antwort

15

Ja, wird der Abschluss-Handler immer aufgerufen. Wenn die Anforderung aufgrund eines Timeouts fehlschlägt, wird die error gesetzt und data = nil werden.

Eine NSURLRequest hat eine Standard-Zeitüberschreitung von 60 Sekunden, aber Sie können request.timeoutInverval einen anderen Wert zuweisen, bevor Sie die Verbindung starten. Daher ist kein zusätzlicher Timer erforderlich.

Hinzugefügt: Im Falle eines Timeouts:

  • [error domain] ist NSURLErrorDomain und
  • [error code] ist NSURLErrorTimedOut,

Wenn Sie wollen einfach nur eine Fehlermeldung präsentiert, Sie kann [error localizedDescription] verwenden, was bedeutet "Die Anfrage ist abgelaufen." in diesem Fall. (Dies kann vom Gebietsschema abhängen.)

+0

Große Antwort, danke! – Groot

+0

@Filip: Gern geschehen. Ich habe einige Informationen hinzugefügt, wie Sie nach einem Timeout suchen können. –

0

[NSURLConnection sendAsynchronousRequest: ...] wird auf jeden Fall einen Abschluss Block in jedem Szenario nennen. Wenn Sie diesen Prozess jedoch auf die maximale Zeit beschränken möchten, können Sie auch den Timeout-Timer verwenden.

Für Fortschrittsbalken, wie werden Sie den Wert erhöhen werden? Anstelle von Fortschrittsbalken empfehle ich Ihnen, mit Aktivitätsindikator zu gehen.

Hoffe, das hilft.

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

Bitte versuchen Sie zu erklären, was Sie getan haben und warum. Menschen lernen nur selten von reinen Code-Antworten. – Jasper

Verwandte Themen