2013-03-20 3 views
5

Molto probabilmente una domanda piuttosto banale ma il blocco di completamento sarà sempre chiamato usando [NSURLConnection sendAsynchronousRequest: ...]? O devo implementare un timer di timeout?[NSURLConnection sendAsynchronousRequest: ...] invia sempre il blocco di completamento?

Si consideri il seguente in cui aggiungo un MBProgressView prima della chiamata e rimuoverlo solo nel blocco completo:

[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

naturalmente. un gestore di completamento è un gestore COMPLETAMENTO - non un gestore di successo: D –

+0

@ Daij-Djan Sono il gestore del successo, non il completatore che completa il completamento! – Groot

+1

if (! Error) = successo: D –

risposta

15

Sì, il gestore di completamento viene sempre chiamato. Se la richiesta non riesce a causa di un timeout, verrà impostato error e data = nil.

A NSURLRequest Un timeout predefinito di 60 secondi, ma è possibile assegnare un valore diverso a request.timeoutInverval prima di iniziare la connessione. Quindi non c'è bisogno di un timer aggiuntivo.

Aggiunto: Nel caso di un timeout:

  • [error domain] è NSURLErrorDomain, e
  • [error code] è NSURLErrorTimedOut,

Se si desidera solo per presentare un messaggio di errore, possibile utilizzare [error localizedDescription], che è "La richiesta è scaduta." in questo caso. (Ciò può dipendere dal locale.)

+0

Ottima risposta, grazie! – Groot

+0

@Filip: sei il benvenuto. Ho aggiunto alcune informazioni su come controllare un timeout. –

0

[NSURLConnection sendAsynchronousRequest: ...] sarà sicuramente chiamata di un blocco di completamento in qualsiasi scenario. Tuttavia, se si desidera limitare questo processo al tempo massimo, è possibile utilizzare anche il timer di timeout.

Per la barra di avanzamento, come si aumenterà il valore? Invece della barra di avanzamento, ti suggerirei di andare con l'indicatore di attività.

Spero che questo aiuti.

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

Si prega di provare a spiegare cosa hai fatto e perché. Le persone imparano raramente dalle risposte solo in codice. – Jasper