NSURLConnection 超时后卡住

Posted

技术标签:

【中文标题】NSURLConnection 超时后卡住【英文标题】:NSURLConnection stuck after timeout 【发布时间】:2014-10-22 01:36:42 【问题描述】:

遇到了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”、“didReceiveData”、“didFailWithError”、“connectionDidFinishLoading”、...中工作正常。

但是,如果发生请求超时,(我已经在“didFailWithError”中 [conn cancel]) 然后,在一段时间内(我没有做精确的计数,而是大约 1 分钟) 我对同一台服务器的所有新请求(再次请求)将一次又一次地超时。 是不是我做错了什么? 或者我应该修改我的代码吗? 我已经尝试了很多解决方案,但仍然没有成功。 所以,寻求帮助,谢谢。

【问题讨论】:

你确定连接服务器没有问题吗?可能是您的网络或您要连接的服务器存在问题。如果请求超时,您可能需要等待一分钟以上才能重试相同的请求。 【参考方案1】:

一个常见的问题是,如果你发起许多NSURLConnection请求,它只能同时运行一定的数量(通常是4或5)。因此,如果您启动的次数不止这些,它一次只能运行其中的几个,而所有其他的都将被积压,等待其中一个插槽可用。可悲的是,如果这需要超过一分钟,后面的请求可能会超时。

对此的一种解决方案是将您的NSURLConnection 对象包装在自定义NSOperation 子类中。然后,您可以将它们添加到NSOperationQueue,而不是一次启动所有连接,让操作队列决定何时启动它们。所以,如果你定义那个队列的maxConcurrentOperationCount为4或者5,那么操作队列就不会尝试同时启动它们,解决NSURLConnection超时问题。

有关如何将NSOperation 子类化以进行并发操作的背景信息,请参阅Concurrency Programming Guide: Operation Queues 的为并发执行配置操作部分。有关将 NSURLConnection 对象包装到 NSOperation 子类中的演示,请参见 https://***.com/a/24943851/1271826。

更好的是,如果您不想在这里迷失细节,请考虑使用AFNetworking,它使用操作队列解决方案(至少对于AFHTTPRequestOperationManager)。只需确保将管理器的操作队列的maxConcurrentOperationCount 设置为 4,然后可以根据需要添加任意数量的网络操作,操作队列将确保它们不会超时。

【讨论】:

以上是关于NSURLConnection 超时后卡住的主要内容,如果未能解决你的问题,请参考以下文章

网络请求

超时后中止卡住的方法

在同步调用上强制 NSUrlConnection 超时

如何使用 NSURLConnection (NSMutableRequest) 超时

NSMutableRequest 和 NSURLConnection 的最大超时时间

NSMutableURLRequest 在大约 15 秒后超时。超时设置为 240 秒