在 iOS 上同时下载多少是有意义的

Posted

技术标签:

【中文标题】在 iOS 上同时下载多少是有意义的【英文标题】:How many simultaneous downloads make sense on iOS 【发布时间】:2012-07-24 09:43:44 【问题描述】:

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

【问题讨论】:

取决于您的速度(wlan、3G 或 4G),但 5 是一个很好的数字。 【参考方案1】:

这取决于几个因素:

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

在我的情况下,我有 100 个缩略图,但后台线程没有响应我的请求,并且似乎应用程序暂停了。我正在使用 iPhone 3gs。如果你有任何想法,请指导我..:) @iPhoneNerd,请参阅上面的编辑文本。【参考方案3】:

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

实际上有一个constant the SDK provides,它会根据各种约束而变化。我建议你考虑使用它。

【讨论】:

感谢您指出 NSOperationQueueDefaultMaxConcurrentOperationCount--我不知道它在里面!【参考方案4】:

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

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

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

额外信息:

NSThead 实现:

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

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

NSOperation-实现:

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

【讨论】:

我遇到了类似的问题,我的应用只发送 5-6 个请求,并在第一个请求完成后等待下一个请求。

以上是关于在 iOS 上同时下载多少是有意义的的主要内容,如果未能解决你的问题,请参考以下文章

在遇到性能问题之前,iOS 上可以同时显示多少个 UIView?

时间流逝及事物常态

window mysql和mariadb可以同时安装吗

编写高质量c#代码的10个建议

Arules 中规则的并集和交集在算术上是有意义的

同时应用谓词来过滤列表(SWI Prolog)