2014-10-22 55 views
2

我遇到了NSURLConnection的问题,并花了超过3天的时间才找到解决方案 ,但不幸的是,我还没有得到一个。 这里是我的代码,这是一个专门的类,并使用completehandler返回NSURLConnection在超时后卡住

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” ...

但是,如果一个请求超时happend,(我已经做了在“didFailWithError” [康恩取消])
然后,在一段时间peroid(我没有做精确的计数,但约1分钟) 我对同一台服务器的所有新请求(再次请求)都会一次又一次地超时。
有什么我做错了吗?
或任何我应该修改我的代码?
我已经尝试了很多解决方案,但仍然没有去。
所以,寻求一些帮助,谢谢。

+0

您确定连接到服务器没有问题吗?这可能与您的网络或连接到的服务器有关。如果请求超时,您可能需要等待一分钟以重试相同的请求。 – 2014-10-22 06:03:22

回答

1

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

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

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

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