遇到了NSURLConnection的问题,花了3天多的时间才找到解决办法
但不幸的是,我没有得到一个。
这是我的代码,这是在一个专门的类中,并使用 completehandler 返回
NSURL *myUrl = [NSURL URLWithString:targetSite];
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:myUrl
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:timeOutInterval];
[urlRequest setHTTPMethod"OST"];
[urlRequest setHTTPBody:MYBODYCONTENT];
conn = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];
if(conn)
{
webData = [NSMutableData data];
}
并使用委托(delegate)接收数据,它在“didReceiveResponse”、“didReceiveData”、“didFailWithError”、“connectionDidFinishLoading”、...中工作正常。
但是,如果发生请求超时,(我已经在“didFailWithError”中[conn cancel])
然后,在一段时间内(我没有做精确的计数,而是大约 1 分钟)
我对同一服务器的所有新请求(再次请求)将一次又一次地超时。
是不是我做错了什么?
或者我应该修改我的代码吗?
我已经尝试了很多解决方案,但仍然没有成功。
所以,寻求帮助,谢谢。
Best Answer-推荐答案 strong>
一个常见的问题是,如果你发起许多NSURLConnection 请求,它只能同时运行一定的数量(通常是4个或5个)。因此,如果您启动的次数不止这些,它一次只能运行其中的几个,而所有其他的都将被积压,等待其中一个插槽可用。可悲的是,如果这需要超过一分钟,后面的请求可能会超时。
对此的一种解决方案是将您的 NSURLConnection 对象包装在自定义 NSOperation 子类中。然后,您可以将它们添加到 NSOperationQueue 中,而不是一次启动所有连接,让操作队列决定何时启动它们。所以,如果你定义该队列的maxConcurrentOperationCount 为4 或5,那么操作队列将不会尝试同时启动它们,解决NSURLConnection 超时问题。
有关如何为并发操作子类化 NSOperation 的背景知识,请参阅 Concurrency Programming Guide: Operation Queues 的为并发执行配置操作部分.见 https://stackoverflow.com/a/24943851/1271826用于在 NSOperation 子类中包装 NSURLConnection 对象的演示。
更好的是,如果您不想在这里迷失细节,请考虑使用 AFNetworking ,它使用操作队列解决方案(至少对于 AFHTTPRequestOperationManager )。只需确保将管理器的操作队列的 maxConcurrentOperationCount 设置为 4,然后可以根据需要添加任意数量的网络操作,操作队列将确保它们不会超时。
关于ios - NSURLConnection 超时后卡住,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/26499079/
|