5

很可能是一个相当微不足道的问题,但完成块是否总是被调用[NSURLConnection sendAsynchronousRequest: ...]?或者我必须实现一个超时计时器吗?

考虑以下我MBProgressView在调用之前添加 a 并仅在完成块中将其删除的情况:

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

3 回答 3

15

是的,完成处理程序总是被调用。如果请求因超时而失败,error将设置 和data = nil

ANSURLRequest的默认超时时间为 60 秒,但您可以request.timeoutInverval在开始连接之前为其分配不同的值。所以不需要额外的计时器。

补充:在超时的情况下:

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

如果您只想显示错误消息,可以使用[error localizedDescription],即“请求超时”。在这种情况下。(这可能取决于语言环境。)

于 2013-03-20T08:23:43.200 回答
2
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url
                                              cachePolicy:NSURLCacheStorageAllowed             
                                          timeoutInterval:20];
于 2013-07-27T09:24:21.417 回答
0

[NSURLConnection sendAsynchronousRequest: ...] 在任何情况下都肯定会调用完成块。但是,如果您想将此过程限制为最大时间,您也可以使用超时计时器。

对于进度条,您将如何增加值?我建议您不要使用进度条,而是使用活动指示器。

希望这可以帮助。

于 2013-03-20T08:22:56.453 回答