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);
}
}];
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.)
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url
cachePolicy:NSURLCacheStorageAllowed
timeoutInterval:20];
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With