菜鸟教程小白 发表于 2022-12-13 02:44:36

ios - NSURLConnection 超时后卡住


                                            <p><p>遇到了NSURLConnection的问题,花了3天多的时间才找到解决办法
但不幸的是,我没有得到一个。
这是我的代码,这是在一个专门的类中,并使用 completehandler 返回</p>

<pre><code>    NSURL *myUrl = ;
    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:myUrl
                                                            cachePolicy:NSURLRequestReloadIgnoringCacheData
                                                          timeoutInterval:timeOutInterval];
    ;
    ;
    conn = [ initWithRequest:urlRequest delegate:self];
    if(conn)
    {
      webData = ;
    }
</code></pre>

<p>并使用委托(delegate)接收数据,它在“didReceiveResponse”、“didReceiveData”、“didFailWithError”、“connectionDidFinishLoading”、...中工作正常。</p>

<p>但是,如果发生请求超时,(我已经在“didFailWithError”中)<br/>
然后,在一段时间内(我没有做精确的计数,而是大约 1 分钟)
我对同一服务器的所有新请求(再次请求)将一次又一次地超时。<br/>
是不是我做错了什么?<br/>
或者我应该修改我的代码吗?<br/>
我已经尝试了很多解决方案,但仍然没有成功。<br/>
所以,寻求帮助,谢谢。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>一个常见的问题是,如果你发起许多<code>NSURLConnection</code>请求,它只能同时运行一定的数量(通常是4个或5个)。因此,如果您启动的次数不止这些,它一次只能运行其中的几个,而所有其他的都将被积压,等待其中一个插槽可用。可悲的是,如果这需要超过一分钟,后面的请求可能会超时。 </p>

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

<p>有关如何为并发操作子类化 <code>NSOperation</code> 的背景知识,请参阅 <a href="https://developer.apple.com/library/mac/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html#//apple_ref/doc/uid/TP40008091-CH101-SW1" rel="noreferrer noopener nofollow">Concurrency Programming Guide: Operation Queues</a> 的<em>为并发执行配置操作</em>部分.见 <a href="https://stackoverflow.com/a/24943851/1271826" rel="noreferrer noopener nofollow">https://stackoverflow.com/a/24943851/1271826</a>用于在 <code>NSOperation</code> 子类中包装 <code>NSURLConnection</code> 对象的演示。</p>

<p>更好的是,如果您不想在这里迷失细节,请考虑使用 <a href="https://github.com/AFNetworking/AFNetworking" rel="noreferrer noopener nofollow">AFNetworking</a> ,它使用操作队列解决方案(至少对于 <code>AFHTTPRequestOperationManager</code>)。只需确保将管理器的操作队列的 <code>maxConcurrentOperationCount</code> 设置为 4,然后可以根据需要添加任意数量的网络操作,操作队列将确保它们不会超时。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - NSURLConnection 超时后卡住,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/26499079/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/26499079/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - NSURLConnection 超时后卡住