Will [NSURLConnection sendAsynchronousRequest: ...] always send completion block?
cocoa-touch, ios, nsurlconnectiondelegate, objective-c
Solution
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.)
Problem
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); } }]; ```