1

我有一个 iOS 应用程序,它在启动时同步一定数量的资产。我正在使用 AFNetworking 并设置一个 NSOperationQueue 来处理所有下载。我想知道,有多少同时下载是有意义的。如果我同时有很多网络性能会下降,是否有限制?目前我一次最多下载 5 次。

4

4 回答 4

4

这取决于几个因素:

  • 网络速度和延迟是多少?
  • 请求和响应的数据大小是多少?
  • 服务器处理请求需要多长时间?
  • 客户端处理响应需要多长时间?
  • 服务器可以有效地满足多少并行请求?
  • 有多少用户会同时发出请求?
  • 目标设备的最小速度和内存大小是多少?

对于中小型应用程序,限制因素通常是设备的网络延迟,但您的情况可能并非如此。最后,您必须测试并找出最有效的折衷方案。5 是一个很好的开始数字。您可能希望通过可用的网络连接(WLAN 或 3G 甚至更慢...)来设置并发下载的数量。

于 2012-07-24T11:49:55.913 回答
4

使用 NSOperationQueues 的美妙之处在于它们与底层操作系统(iOS 或 OSX)紧密相关。队列根据许多因素决定运行多少操作,包括可用内存、系统负载等。

您不应该尝试对系统进行第二次猜测并限制自己。排队尽可能多的操作,让操作系统处理它。我有一个 iPhone 应用程序,当它必须获取不同大小的图像等时,它会在队列中添加数百个操作。效果很好,UI 没有被阻塞等。

编辑:好吧,似乎在进行 NSURLConnections 和类似的网络连接时,NSOperationQueue 并没有真正关注网络使用情况。今年夏天我在 Apple 内部论坛上问过,最后被 Quinn “The Eskimo”(Apple 网络大师)告知使用 4 之类的限制。所以这个帖子在纯处理能力的意义上是正确的 - NSOperationQueue会做正确的事——但是当涉及到网络操作时,你需要设置一个限制。

于 2012-07-24T12:16:06.980 回答
2

我会说主要取决于您的硬件。解决这个问题的最好方法是用多个案例和多个试验对其进行测试。尽量使你测试的硬件多样化(记住不要使用模拟器来测试这个!)。

实际上,SDK 提供了一个常数,该常数因各种约束而异。我建议您考虑使用它。

于 2012-07-24T11:11:31.897 回答
1

关于这个问题,我在一台Ipad2 IOS6.0上做了一些测试。我创建了一个对网络服务器执行 HTTP-GET 请求的小应用程序。该网络服务器将提供 60 秒的数据(为了获得有意义的结果,在我的测试中将其更改为 10 分钟后)。

对于一个 HTTP-GET 请求,它工作得非常好。然后我尝试同时执行几个 HTTP 请求,看看我可以通过 iPad 的 WIFI 连接下载多少和多快

我做了2个版本。1 个版本使用 NSOperations 和 1 个版本使用 NSThread 同步 HTTP-GET 请求。简而言之,我的第 6 个请求总是会超时。( tcp-syn 无法访问我的 HTTP-Server )。

额外信息:

NSThead 实现:

只需创建一个 for 循环并创建一个线程。这将执行同步的 HTTP 请求。

在那里我观察到我的第 6 个请求在 20 秒后超时。如果我将超时设置为 80 秒,我清楚地看到在我的第一个 http 请求结束后(60 秒后)我的第 6 个请求被启动......

NSOperation-实现:

创建一个队列并将 maxConcurrentOperations 设置为 12。将 12 个 http-request 操作添加到队列中。在这里,我还注意到第 6 个请求得到了 -1001 错误代码(意思是: timout )。我看不到第 6 个请求的 tcp-syn。

于 2013-02-26T09:21:14.357 回答