如何使用AFNetworking 2.x管理多个(> 500)后台URLSession下载?

时间:2015-07-23 19:15:37

标签: ios objective-c afnetworking

我在应用程序商店上有一个应用程序使用AFNetworking 2.x在后台下载基于NSURLSession的下载大文件,因为用户经常将应用程序放在后台(它会在一段时间后终止,但下载完成所有相同。精彩)。这个程序运行良好。通常用户一次只下载几个文件。

现在我需要创建另一个类似的应用程序,但这次不是几个大文件,用户很可能想要下载大量的小文件:例如,500个文件是1-5mb每。同样,应用程序通常会放在后台,所以我想继续使用NSURLSessionDownloadTask,除非有一个非常好的理由不这样做。

我的问题是,我可以一次创建500个NSURLSessionDownloadTasks吗? AFNetworking是否会进行一些巧妙的限制,以免系统超载?或者iOS会这样做吗?或者什么都不做,我必须痛苦地追踪和整理我的应用程序重启的转移状态(即因为它被放到后台最终终止)?

如果有人知道你可以同时可靠地创建多少NSURLSessionDownloadTasks的限制,那将是非常棒的... 谢谢!

P.S。我非常喜欢obj-c到swift,thx:)

2 个答案:

答案 0 :(得分:1)

最后我检查过(看不到iOS 9测试版),任务创建出乎意料地昂贵且超线性。在我的测试运行中:

  • 50个任务 - > 〜1.5秒
  • 200个任务 - > 〜11.5s
  • 500个任务 - > 〜55S

由于我的文件数通常是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