我有一个 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 发送请求。什么可能导致这种行为?