Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Will [NSURLConnection sendAsynchronousRequest: ...] always send completion block?

Most likely a rather trivial question but will the completion block always be called using [NSURLConnection sendAsynchronousRequest: ...]? OR do I have to implement a timeout timer?

Consider the following where I add a MBProgressView before the call and remove it ONLY in the completion block:

[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);
     }
 }];
like image 218
Groot Avatar asked Mar 20 '13 08:03

Groot


2 Answers

Yes, the completion handler is always called. If the request fails due to a timeout, the error will be set and data = nil.

A NSURLRequest has a default timeout of 60 seconds, but you can assign a different value to request.timeoutInverval before starting the connection. So there is no need for an extra timer.

Added: In the case of a timeout:

  • [error domain] is NSURLErrorDomain, and
  • [error code] is NSURLErrorTimedOut,

If you just want to present an error message, you can use [error localizedDescription], which is "The request timed out." in this case. (This may depend on the locale.)

like image 107
Martin R Avatar answered Nov 15 '22 06:11

Martin R


NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url
                                              cachePolicy:NSURLCacheStorageAllowed             
                                          timeoutInterval:20];
like image 24
Arash Zeinoddini Avatar answered Nov 15 '22 05:11

Arash Zeinoddini