我遇到了NSURLConnection的问题,花了3天多的时间才找到解决方案但不幸的是,我没有拿到。这是我的代码,这是在一个专用类中,并使用completehandler返回
NSURL *myUrl = [NSURL URLWithString:targetSite];
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:myUrl
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:timeOutInterval];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setHTTPBody:MYBODYCONTENT];
conn = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];
if(conn)
{
webData = [NSMutableData data];
}
并使用委托接收数据,它在"didReceiveResponse"、"didRReceiveData"、"didFailWithError"、"connectionDidFinishLoading"、。。。
但是,如果请求超时,(我已经在"didFailWithError"中执行了[conn cancel])
然后,过了一段时间(我没有做精确的计数,但大约1分钟)我对同一服务器的所有新请求(再次请求)都将一次又一次地超时
我做错了什么吗
或者我应该修改我的代码吗
我尝试了很多解决方案,但仍然没有成功
所以,寻求一些帮助,谢谢。
一个常见的问题是,如果您启动许多NSURLConnection
请求,它只能同时运行一定数量的请求(通常是4或5)。因此,如果你启动了更多的插槽,它一次只能运行其中的几个,而所有其他插槽都会积压,等待其中一个插槽可用。遗憾的是,如果这需要一分钟以上的时间,后一个请求可能会超时。
一种解决方案是将NSURLConnection
对象包装在自定义NSOperation
子类中。然后,您可以将它们添加到NSOperationQueue
中,让操作队列决定何时启动它们,而不是一次启动所有连接。因此,如果将该队列的maxConcurrentOperationCount
定义为4或5,则操作队列不会尝试同时启动所有队列,从而解决NSURLConnection
超时问题。
有关如何为并发操作子类化NSOperation
的背景信息,请参阅《并发编程指南:操作队列》的配置并发执行操作部分。看见https://stackoverflow.com/a/24943851/1271826用于在CCD_ 9子类中封装CCD_。
更好的是,如果您不想迷失在这里的细节中,可以考虑使用AFNetworking,它使用操作队列解决方案(至少对于AFHTTPRequestOperationManager
)。只需确保将管理器的操作队列的maxConcurrentOperationCount
设置为4,然后可以根据需要添加任意数量的网络操作,操作队列将确保它们不会超时。