NSURL连接在超时后卡住



我遇到了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,然后可以根据需要添加任意数量的网络操作,操作队列将确保它们不会超时。

相关内容

  • 没有找到相关文章

最新更新