我要求按顺序下载文件。目前,我可以在app处于前台时这样做。
以下是我使用的逻辑。
创建所有下载任务。
一次恢复一个,当前结束时从URLSession:task:didCompleteWithError:
恢复下一个。
这个逻辑在应用处于前台时工作但是一旦应用程序开始在后台运行(通过崩溃),我们再次运行应用程序,然后下载完成所有任务状态已更改为恢复并且所有任务都在同时下载
这是预期的行为还是我缺少的任何东西,在后台模式下也可以串行订购?
修改
我通过逐个创建下载任务来检查。完成第一个任务后,在setTaskDidCompleteBlock
内创建下一个,依此类推。它只完成第一个任务,然后在setTaskDidCompleteBlock
内创建任务时该会话崩溃(这只发生在后台运行时,前台工作正常)。
这是我的崩溃日志屏幕截图:
和
任何帮助都将不胜感激。
答案 0 :(得分:1)
如果你绝对需要按顺序运行这些请求,我建议不要事先实例化所有这些任务,而是一次一个地实例化它们,只在前一个完成后实例化下一个。
但我们必须认识到,为顺序运行请求会给您带来显着的性能损失。 (使用后台会话时,此问题将被放大。)如果可能,请查看是否可以更改并发运行的请求。显然,如果您需要输出一个以便为另一个创建请求,那么您就会陷入困境(或者至少在您重构服务器代码之前),但这显然不是问题(因为您预先创建了所有请求)。如果您出于人为原因而执行此顺序请求过程(例如,代码填充数组并且您希望按顺序排列),那么您可能需要重新设计实现以删除此人为约束。
答案 1 :(得分:0)
我也看到过这种情况。如果您在应用程序位于前台但未调用resume()
时创建了downloadTask,则它将无法启动 - 但是,当应用程序处于后台运行时,它将自动启动。
解决方案是在创建每个downloadTask时显式调用suspend()
。然后,当您准备开始下载时,请致电resume()
。
显然,新创建的downloadTask既不会被暂停也不会被恢复。它的初始状态不是.Running
,但当应用程序背景时,它会转移到.Running
,因为它尚未明确暂停。这是令人惊讶的行为;我不知道为什么后台会话守护进程以这种方式工作。