[NSURLConnection sendAsynchronousRequest: ...]总是会发送完成块吗?

5

这可能是一个相当简单的问题,但是使用[NSURLConnection sendAsynchronousRequest:...]时,完成块是否总是被调用?还是我必须实现超时计时器?

考虑以下情况,在调用之前添加MBProgressView,并仅在完成块中删除它:

[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);
     }
 }];

自然而然,完成处理程序是一个完成处理程序 - 而不是成功处理程序:D - Daij-Djan
@Daij-Djan 我是成功处理程序,而不是完成补全的补全者! - Groot
1
如果(!错误)= 成功:D - Daij-Djan
3个回答

15

是的,完成处理程序始终会被调用。如果请求由于超时而失败,则error将被设置为NSURLErrorTimedOutdata = nil

NSURLRequest的默认超时时间为60秒,但您可以在启动连接之前将不同的值分配给request.timeoutInverval。因此,不需要额外的计时器。

添加: 在超时的情况下:

  • [error domain]NSURLErrorDomain,并且
  • [error code]NSURLErrorTimedOut

如果您只想显示错误消息,则可以使用[error localizedDescription],在这种情况下是"The request timed out."(这可能取决于语言环境)。


@Filip:不用谢。我已经添加了一些信息,告诉你如何检查超时。 - Martin R

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

2
请尝试解释您所做的事情以及原因。仅有代码的答案很少能让人学到东西。 - Jasper

0

[NSURLConnection sendAsynchronousRequest: ...] 无论什么情况下都会调用完成块。不过如果你想将这个过程限制在最长时间内,你可以使用超时计时器。

关于进度条, 你会如何递增值?我建议你使用活动指示器代替进度条。

希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接