1

我有一个应用程序向数据服务器发出多个 URL 请求以下载用户数据。我试图通过并行发出 10 个请求来加快下载时间。我尝试了几种不同的方法来做到这一点,但我一直得到的结果是,虽然我(几乎)同时发送了 10 个请求,但我一次只收到一个返回的数据。这意味着总下载时间与我连续发出所有请求一样。这是我尝试过的不同方法。

  1. 创建了一个 NSOperation 的子类,它具有一个 NSURLConnection 对象并充当该 NSURLConnection 的委托。将此 NSOperation 子类的 10 个实例添加到 NSOperationQueue。
  2. 创建了 10 个 NSURLConnection 对象并一个接一个地启动它们。(使用单独的委托对象,以便我可以保持响应直截了当。)

这两种情况都可以正确下载数据,但它们都不会像我预期的那样快速接收数据。服务器响应请求所需的时间约为 0.5 - 1.0 秒。因此,如果请求真正并行发出,我希望最多在 1 秒内收到所有 10 个响应。在这两种方法中,我观察到 NSURLConnections 都在大约 5 毫秒内启动,但是请求的 connect:didReceiveResponse 方法以大约 0.7 秒的间隔一个接一个地被调用,就好像请求是连续发出的一样.

我是否误解了 NSURLConnections 或 NSOperationQueues 的工作方式?任何帮助,将不胜感激。谢谢!

4

1 回答 1

0

如果您使用多个 NSURLConnection 向同一服务器发出请求,那么您实现的两种方式几乎没有任何区别。但是,如果您要与 10 个不同的服务器建立 10 个连接,其中一个或两个可能非常慢并且需要时间来响应请求,那么第二种方法将比第一种方法花费更多时间。在第二种方法中,仅在您从当前请求获得响应后才会发送下一个请求,但在第一种方法中,因为请求正在并行运行,因此请求将在获得响应后立即完成,下一个请求将排队。在这种情况下,如果 maximumConcurrentOperation = 1,两种方法都会给出相同的结果。

    Approach 2:
<--t1--><--t2--><--t3--><------t4------><--t5--><--------t6--------><--t7--><--t8-->
<----------------------------------Total Time-------------------------------------->

Approach 1: maximumConcurrentOperation = 2

<--t1-->
<--t2-->
        <--t3-->
        <------t4------>
                <--t5-->
                        <--------t6-------->
                        <--t7-->
                                <--t8-->
<--------------Total Time------------------>

希望这能消除您的疑问。

于 2012-06-04T18:59:55.183 回答