我正在使用NSURLSessionDownloadTask下载文件。在应用程序的某一点,有必要暂停下载一小段时间,然后恢复它。我尝试使用suspend方法暂停下载,但任务连续下载。 NSURLSessionTask方法的Apple文档暂停状态:
任务暂停时不会产生网络流量,也不会超时。下载任务可以在以后继续传输数据。所有其他任务必须在恢复时重新开始。
这似乎表明我正在做的是对的,但结果并不像预期的那样。我能够使用Playground中的以下代码重现它。
import UIKit
let backgroundSessionConfiguration = URLSessionConfiguration.background(withIdentifier: "some-identifier")
let backgroundSession = Foundation.URLSession(configuration: backgroundSessionConfiguration, delegate: nil, delegateQueue: nil)
let request = URLRequest(url: URL(string: "http://google.com")!)
let task = backgroundSession.downloadTask(with: request)
task.state.rawValue
task.resume()
task.state.rawValue
task.suspend()
task.state.rawValue
sleep(10)
task.state.rawValue
任务状态的预期结果是 1,0,1,1 (0 - 下载,1 - 暂停,2 - 取消,3 - 完成)。实际结果为 1,0,1,3 。这意味着虽然任务已暂停,但仍会继续下载并在下载完成后标记自己。
应用程序中的设置更复杂,并且无法始终复制任务状态(在Playground中结果似乎总是相同)但暂停任务后的结果始终是文件已成功下载(包括进度)调用回调)。
问题: 难道我做错了什么?我是否误解了Apple文档,并且不可能以这种方式暂停下载任务?
我在应用程序中遇到此问题的第一个直觉是我在其他地方调用简历导致下载继续,但在调试代码后似乎不是这样的情况+ Playground的结果支持这个好。
答案 0 :(得分:1)
可能不是您正在寻找的答案,但Apple Dev Relations代表confirmed in their dev forums使用suspend
在某些情况下,后台下载无法真正暂停:
[...]暂停的任务仍然可以在线路上激活;
suspend
所做的就是阻止它在内部取得进展,发出回调等等。
他们继续建议使用cancel(byProducingResumeData:)
代替:
如果您实施长期暂停(例如,用户想要暂停下载),您最好拨打
-cancelByProducingResumeData:
。