超时后NSURLConnection卡住了

时间:2014-10-22 01:36:43

标签: ios timeout nsurlconnection

我遇到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 个答案:

答案 0 :(得分:1)

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

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

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

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