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

我有要求以连续的顺序下载文件。 目前我能够做到这一点,而应用程序在前台。

以下是我用过的逻辑。

  1. 创build下载的所有任务。

  2. 一次恢复一个,并且当前完成从URLSession:task:didCompleteWithError:恢复下一个URLSession:task:didCompleteWithError:

这个逻辑工作,而应用程序在前台,但一旦应用程序开始在后台运行(通过崩溃),我们再次运行应用程序,在下载完成所有任务状态已更改为恢复,并同时都在下载。

这是预期的行为或任何我缺less的顺序在后台模式下呢?

编辑:我通过创build下载任务逐一检查。 在完成第一个任务之后创build下一个setTaskDidCompleteBlock等等。 它只完成第一个任务,然后在setTaskDidCompleteBlock内部创build任务时setTaskDidCompleteBlock (这只发生在后台运行时,前台工作正常)。

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

drive.google.com/file/d/0B9jFCUPsPtV6YW5zbTJrQ0pQYlk/view?usp=sharing

drive.google.com/file/d/0B9jFCUPsPtV6UkEwOURpZmZYcEU/view?usp=sharing

任何帮助,将不胜感激。

如果你绝对需要按顺序运行这些请求,我build议不要在前面实例化所有这些任务,而是一次实例化一个任务,而只是在完成前一个任务时实例化下一个任务。

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

我也看到过这种情况。 如果您在应用程序处于前台时创builddownloadTask,但不要调用resume() ,则不会启动 – 但是,当应用程序停止后,它将自动启动。

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

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