使用委托处理NSURLRequest超时问题

10

我正在使用NSMutableURLRequest连接到一个网站以获取JSON响应。我通过生成请求,然后使用具有自身委托的NSURLConnection来处理异步连接来实现此目的。我已经实现了所有正常的委托方法:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
- (void)connectionDidFinishLoading:(NSURLConnection *)connection

获取数据和处理错误都完美无缺,但是当NSURLRequest的超时时间设为10秒时,这些方法似乎不会被调用(我期望didFailWithError会被调用)。它只是永远地停留在那里,我没有得到超时通知。

查看iPhone API文档,我没有发现任何提及超时发生后应该 发生什么事情 的说明,只有设置超时值的内容。那么应该怎么做呢?在API中是否有其他的代理方法可以帮助处理?我需要手动检查超时吗?超时只适用于同步请求吗?


我同意Corey的观点,我应该在didDailWithError方法中获取它,但它从未被调用。该方法内的断点和日志都显示,在超时情况下它从未被调用。 - Parrots
1
如果需要更多上下文,我正在使用https://dev59.com/CHRC5IYBdhLWcg3wVvct中提到的方法来跟踪我所拥有的连接。 - Parrots
看起来这可能是3.0测试版SDK中的一个bug,因为一旦正式版发布,它就按预期工作了。 - Parrots
5个回答

12

您的超时时间将在此方法中接收:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

你如何测试超时?那似乎是一个通用的错误处理程序。 - devios1
@devios1 为不可用的端口设置了 URL google.com,例如 google.com:5555。 - Alexufo

4
您将收到以下类型的信息:
在执行时失败,具体错误信息如下:
错误: 错误域=NSURLErrorDomain 代码=-1001 用户信息=0xed4870 "超时"

请注意 NSURLErrorTimedOut = -1001 - devios1

3
超时行为有点古怪,请参见苹果开发者论坛上的此主题

1
那个线程很好!谢谢!请注意,该线程提供了一个指向 https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference.html 的参考链接,该链接列出了 NSURLErrorDomain 中的所有错误。 - David H

2

我所做的是这样的:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    if (error.code == -1001){
        [self showTimeoutAlert];//My method to show dialog with timeout message.
    } else {
        [self showInvalidURLAlert];//My method to show dialog with bad URL message.
    }
}

如前所述,-1001代表超时,在其他测试中,我得到了-1003(表示URL错误或无可用连接)。

我原本是想处理超时的,所以我把其他任何问题都视为URL错误。


1
在每个方法中添加一些日志语句并检查它们的输出。每当超时发生时,您肯定会在控制台上收到有关超时的通知。我已经收到了这个通知。请检查您的代码,如果您仍然有问题,请告诉我们。

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