【问题标题】:Fifth NSURLConnection's delegate not called未调用第五个 NSURLConnection 的委托
【发布时间】:2015-12-01 14:13:09
【问题描述】:

我在我的应用程序中使用NSURLConnection 进行下载。它工作正常。当我开始连接时,代表方法

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse*)response
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
- (void)connectionDidFinishLoading:(NSURLConnection*)connection

被调用。

但是当连接数超过 4 时,对于第 5 个连接,在前四个连接中的任何一个调用委托方法 "connectionDidFinishLoading" 之前,不会调用委托方法(意味着任何四个连接之一已完成)。然后第五个连接的代表(didReceiveResponsedidReceiveData)开始被调用。简而言之,我的 NSURLConnection 是一次只为 4 个连接调用的委托方法。

我只想知道有什么方法可以增加此限制,以便一次调用超过 4 个(可能是 8 个或 9 个)连接的代表?这是 iOS 的限制还是我的应用有问题。

【问题讨论】:

  • 您是否在多台服务器和不同的网络基础设施(不同的 LAN 和 ISP 等)上对此进行了测试?
  • 我建议您使用AFNetworking 而不是NSURLConnection。我认为这会让你的生活更轻松。

标签: ios objective-c delegates nsurlconnection nsurlconnectiondelegate


【解决方案1】:

查看http://blog.lightstreamer.com/2013/01/on-ios-url-connection-parallelism-and.html

iOS 对并发 NSURLConnections 的数量有限制 相同的终点?不?也许你应该这样做,我们很难发现。

他们还提供了一个线程池实现来绕过这个限制。

【讨论】:

    【解决方案2】:

    我认为您应该将这些连接安排到一个手动创建的队列而不是默认队列,以避免潜在的影响。这对我来说很有用。以下是您可以尝试的示例代码:

    NSURLRequest *request; // a URL request
    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // manual create queue to schedule your URL connections
    queue.maxConcurrentOperationCount = 10; // configure the max count
    
    // by specifying NO for the #startImmediately# parameter, 
    // you can schedule an connection on the queue you like before it starts.
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; 
    [connection setDelegateQueue:queue];
    [connection start];
    

    希望这会有所帮助。

    【讨论】:

    • 那无济于事。操作队列中的并发操作数,根据定义只能减少队列中运行的并发NSURLConnection请求数,不能增加。
    • 没关系。我误读了这一点,并认为您在操作队列中使用了一种不同的(糟糕的)技术来处理同步请求。您的方法可能有效。使用 NSURLSession 可能仍然更好,它不仅为您提供支持,而且实际上由 Apple 记录为这样做。 :-)
    【解决方案3】:

    你不能用 NSURLConnection 来解决它(实际上),但如果你用 NSURLSession 代替,你可以轻松解决问题。

    NSURLSession API 允许您控制每台服务器的最大并发请求数。只需在会话配置对象上设置 HTTPMaximumConnectionsPerHost 属性,然后基于该配置创建一个会话,然后在该会话中创建任务,就像创建 NSURLConnection 对象一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      相关资源
      最近更新 更多