如何在完成处理程序块中检查 NSURLSessionDownloadTask 的状态?
Posted
技术标签:
【中文标题】如何在完成处理程序块中检查 NSURLSessionDownloadTask 的状态?【英文标题】:How do I check the state of a NSURLSessionDownloadTask in the completion handler block? 【发布时间】:2014-10-16 13:46:43 【问题描述】:假设我创建了一个NSURLSessionDownloadTask
:
let downloadTask = session.downloadTaskWithURL(URL, completionHandler: location, response, error in
...
如果我稍后在该 downloadTask 上调用 cancel()
,它仍会调用完成处理程序,对吗?我想检查下载任务的状态是否为Cancelling
,这样它就不会试图弄乱下载的图像,在这种情况下不会有。
我无法检查下载任务本身的状态,因为它在变量的创建过程中。
【问题讨论】:
您找到解决方案了吗? 【参考方案1】:检查完成处理程序中的error
参数。或查看NSURLSessionTask
的state
属性。如果它等于 'NSURLSessionTaskState.Completed' 则下载任务不会被取消。文档说:
任务已经完成(没有被取消),并且任务的 委托不再收到回调。如果任务完成 成功,任务的错误属性为零。否则,它提供 一个错误对象,它告诉我们出了什么问题。这种状态下的任务是 不受超时限制。
【讨论】:
我无法检查任务的状态,因为它在任务的初始化中。 你是对的。斯威夫特不允许这样做。您可以使用委托而不是基于块的完成。在URLSession:downloadTask:didFinishDownloadingToURL:
方法中,您可以检查downloadTask
的state
【参考方案2】:
完成处理程序只会在任务完成时执行,因此您可以在实例化时实际使用它。为什么不利用捕获列表来强制执行弱循环:
let downloadTask = session.downloadTaskWithURL(URL, completionHandler: [weak downloadTask] location, response, error in
...
请记住,处理程序中的任务状态可能是completed
,因此您应该检查的是错误参数
【讨论】:
以上是关于如何在完成处理程序块中检查 NSURLSessionDownloadTask 的状态?的主要内容,如果未能解决你的问题,请参考以下文章
如何处理完成处理程序块中取消的 NSURLSessionTask ?
DispatchQueue.main.async 块中未更新完成处理程序的返回值