NSURLSessionDownloadTask 在后台自动恢复所有任务

Posted

技术标签:

【中文标题】NSURLSessionDownloadTask 在后台自动恢复所有任务【英文标题】:NSURLSessionDownloadTask resumes automatically all task while in background 【发布时间】:2015-08-13 16:32:34 【问题描述】:

我需要按顺序下载文件。目前我可以在应用程序处于前台时做到这一点。

以下是我使用的逻辑。

    创建所有下载任务。

    一次恢复一个,当前完成后从URLSession:task:didCompleteWithError:恢复下一个。

此逻辑在应用程序处于前台时有效,但一旦应用程序开始在后台运行(通过崩溃)并且我们在下载完成之前再次运行应用程序,所有任务状态已更改为恢复并且所有任务都在同时下载.

这是预期的行为还是我在后台模式下以串行方式订购的任何东西?

编辑: 我通过一一创建下载任务进行了检查。完成第一个任务后,在setTaskDidCompleteBlock 内创建下一个,依此类推。它只完成第一个任务,并且在setTaskDidCompleteBlock 内创建任务时该会话崩溃(这仅在后台模式下运行时发生,前台工作正常)。

这是我的崩溃日志屏幕截图:

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

如果您绝对需要按顺序运行这些请求,我建议不要预先实例化所有这些任务,而是一次实例化它们,仅在前一个完成后实例化下一个。

但我们必须认识到,您为按顺序运行请求付出了巨大的性能损失。 (并且在使用后台会话时这个问题会被放大。)如果可能的话,看看你是否可以将你的请求更改为并发运行。显然,如果您需要一个输出来创建另一个请求,那么您会被卡住(或者至少在您重构服务器代码之前),但这显然不是这里的问题(因为您创建了所有请求正面)。如果您出于人为原因执行此顺序请求过程(例如,代码正在填充数组并且您希望按顺序执行),那么您可能需要重新设计实现以消除此人为约束。

【讨论】:

非常感谢您的建议。我的文件主要是视频,当用户选择一个剪辑时,我必须下载四个视频。关于顺序:因为剪辑中的这四个视频非常接近现场直播,所以我的客户希望按顺序播放。我还尝试从 setTaskDidCompleteBlock 创建一个新任务。但似乎我的 NSURLSession 在第一次下载后崩溃(如果从后台下载,对于前台它工作正常)。这是从 setTaskDidCompleteBlock 实例化下一个下载任务的好方法吗?顺便说一句,我正在使用 AFnetworking。 好的,但是对它进行基准测试,因为如果他们希望快速下载它们,如果同时下载它们会更快。但我了解自定义问题。关于崩溃,如果没有有关崩溃的详细信息、您的 AFNetworking 后台实现(例如***.com/a/21359684/1271826)等,我们无法对此发表评论。这可能需要对这些详细信息提出另一个问题。 好的,我现在也在检查这个并发下载速度。我已经用崩溃日志编辑了我的问题。如果我的要求不高,您也可以看看。 @Nikhil.T - 不,我担心那些崩溃日志对我没有帮助(因为它们在nsurlsessiond 内,并且没有说明代码中导致崩溃的原因)。我实际上建议添加大量的NSLog 语句来确定您的代码在崩溃之前已经走了多远。有很多可能的问题(当您创建第二个请求时,请在调用 resume 之前仔细检查一切是否正常;确保您成功调用了传递给您的应用程序委托的 completionHandler;使用 Charles 等进行监控) .调试后台NSURLSession 并不总是那么容易。 好的,我明白了,我会按照建议尝试。非常感谢您的帮助。【参考方案2】:

我也见过这种情况。如果您在应用程序处于前台时创建 downloadTask 但不调用resume(),它将不会启动 - 但是,当应用程序处于后台时它会自动启动。

解决方案是在创建每个 downloadTask 时显式调用 suspend()。然后,当您准备好开始下载时,请致电resume()

显然,一个新创建的 downloadTask 既没有挂起也没有恢复。它的初始状态不是.Running,但是当应用程序在后台运行时,它会转移到.Running,因为它没有被显式挂起。这是令人惊讶的行为;我不知道为什么后台会话守护进程会这样工作。

【讨论】:

以上是关于NSURLSessionDownloadTask 在后台自动恢复所有任务的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSessionDownloadTask 进度回调不顺畅?

在 NSMutableDictionary 中设置 NSURLSessionDownloadTask

NSUrlSessionDownloadTask - 进入后台时出现didCompleteWithError

iOS开发之网络编程--2NSURLSessionDownloadTask文件下载

NSURLSessionDownloadTask 在挂起时继续下载

在下载字节时从 NSURLSessionDownloadTask 访问字节