NSURLConnection 挂起

Posted

技术标签:

【中文标题】NSURLConnection 挂起【英文标题】:NSURLConnection Hanging 【发布时间】:2012-04-18 03:43:54 【问题描述】:

我有一个 ios 5 应用程序,它使用 NSURLConnection 通过 GET 加载一些 XML。在极少数情况下,连接似乎会陷入反复超时的情况。

一个示例请求:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:url]];
/*
The request is set with a timeout interval of 10 because (due to the nature of 
the app and the XML feed) this data is reloaded every 15 seconds.
*/
[request setTimeoutInterval:10];
[request setCachePolicy:NSURLRequestReloadIgnoringCacheData];
[request setHTTPMethod:@"GET"];
self.afOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
self.afOperation.successCallbackQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);
self.afOperation.failureCallbackQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);
//snip success/completion block code
[self.afOperation start];

到目前为止,当请求开始挂起时,我已经看到了三种“恢复”场景。

退出整个应用程序 将设备插入计算机(是的,真的)。在 iPhone/iPad 确认连接后,它将立即停止超时。 离开应用程序,去做一些别的事情。快速离开和重新进入应用程序通常不足以导致恢复。

如您所想,我觉得这非常奇怪。此时我已经用 AFNetworking 替换了我自己的 NSURLConnectionDelegate 实现(如上所示),并且仍然遇到同样的问题。我为每个 NSURLConnectionDelegate 协议选择器添加了日志记录,发现唯一调用的选择器(在调用start 之后)是connection:didFailWithError:。我确保我没有堆积多个请求(之前的请求总是被取消并且在开始新的请求之前被取消)。此外,我已验证实际上没有通过路由器上的 tcpdump 发送请求。什么可能导致这种行为?

【问题讨论】:

嗨,Paul,您是否尝试过在浏览器中请求您的 URL 并记录响应时间的小基准测试,超时请求通常是由于带宽不足或服务器端出现问题。如果您在超时中设置更高的数字,它会再次发生吗? @Andrea 不幸的是这没有帮助。发生这种情况的症状不是单个超时,而是一系列无休止的超时(从服务器重新请求同一组 URL)。如果我通过其他方式(例如笔记本电脑上的浏览器)获取确切的 URL,它将在 iOS 应用程序继续超时时完美加载。只有上面列出的 3 种方法会停止超时行为。 很奇怪,我建议你尝试在另一个应用程序中隔离连接机制,并使用普通的 NSUrlConnection 而不是 AF,尝试发出普通请求而不是可变请求。 【参考方案1】:

原来这个问题是由TestFlight SDK v1.0 及以下版本引起的。见Why does NSURLConnection fail to reach the backend?

在他们发布修复程序之前,除了完全剥离 SDK 之外,无法解决该问题。

【讨论】:

【参考方案2】:

安装 testflight sdk 后我开始看到错误,删除它帮助我摆脱了它。但是,我认为这是由 Testflight 和 ASIHttpRequest (或您使用的任何其他工具包)之间的交互引起的。也可以通过以下链接中的解决方案来解决(在构建阶段禁用 ASIHttpRequest 和 ASIFormDataRequest 文件的编译器优化)

https://groups.google.com/forum/?fromgroups#!topic/asihttprequest/fw7PDcD2wKI%5B1-25%5D

【讨论】:

以上是关于NSURLConnection 挂起的主要内容,如果未能解决你的问题,请参考以下文章

停止/中止 NSURLConnection

IOS:多个 NSUrlConnection 以及多个 UIProgressBar

NSURLConnection的使用

iOS网络开发使用NSURLConnection

在同步调用上强制 NSUrlConnection 超时

NSURLSession与NSURLConnection区别