我在应用程序商店上有一个应用程序使用AFNetworking 2.x在后台下载基于NSURLSession的下载大文件,因为用户经常将应用程序放在后台(它会在一段时间后终止,但下载完成所有相同。精彩)。这个程序运行良好。通常用户一次只下载几个文件。
现在我需要创建另一个类似的应用程序,但这次不是几个大文件,用户很可能想要下载大量的小文件:例如,500个文件是1-5mb每。同样,应用程序通常会放在后台,所以我想继续使用NSURLSessionDownloadTask,除非有一个非常好的理由不这样做。
我的问题是,我可以一次创建500个NSURLSessionDownloadTasks吗? AFNetworking是否会进行一些巧妙的限制,以免系统超载?或者iOS会这样做吗?或者什么都不做,我必须痛苦地追踪和整理我的应用程序重启的转移状态(即因为它被放到后台最终终止)?
如果有人知道你可以同时可靠地创建多少NSURLSessionDownloadTasks的限制,那将是非常棒的... 谢谢!
P.S。我非常喜欢obj-c到swift,thx:)
答案 0 :(得分:1)
最后我检查过(看不到iOS 9测试版),任务创建出乎意料地昂贵且超线性。在我的测试运行中:
由于我的文件数通常是5位数,因此一次安排所有内容并不是我的解决方案。我的方法(还没有在生产中,我停止使用该功能支持其他事情),将持久性与NSURLSessionDownloadTask
相结合,并使用会话标识符来排序特定文件属于哪个逻辑下载。根据我是否处于正常生命周期或来自-application:handleEventsForBackgroundURLSession:completionHandler:
(调试此情况可能会变得痛苦; NSUserDefaults
是您的朋友),可以从其中一个代表安排进一步下载。理论看起来很合理,我可以看到任务确实已经安排好了,但我目前仍然不能让iOS下载器守护程序符合我的意愿。
如果Benjamin Jimenez建议的服务器端拉链是你的选择,请帮个忙,然后使用它。
答案 1 :(得分:1)
苹果开发人员论坛上的Apple员工“eskimo”帮助我找到了答案,您可以在此论坛帖子中看到:
https://forums.developer.apple.com/thread/11621
在这里粘贴相关部分:
(我)我已经通读了这个帖子以及你在这里链接的那个帖子 (https://devforums.apple.com/message/938057#938057)我有一个 关于通过下载10,000-20,000个文件的最佳实践的问题 NSURLSessionDownloadTasks。 (免责声明,我正在使用AFNetworking 2.x)。 我的目标是iOS 8及更新,所以答案不必在iOS上运行 7.我们如何计算合理的批次(组)大小?我理解恢复速率限制器意味着希望批量大小更高, 但是同时任务请求的最大上限是未知的 会使守护进程崩溃。
(我)我的假设是,当用户打开我的应用程序并运行时 在前景中的某个时间,然后速率限制器被“重置”或 类似的 - 所以现在事情会很好地流动。这是假设 正确的吗?
(爱斯基摩人)是的。此外,从iOS 8开始,如果用户带来了您的应用程序 在前面,iOS将自动给任务“踢”。我有 忘记了这个的确切机制,但我很确定它被覆盖了 在WWDC 2014 Session 707 What's New in Foundation Networking。