如何在完成处理程序块中检查 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 参数。或查看NSURLSessionTaskstate 属性。如果它等于 'NSURLSessionTaskState.Completed' 则下载任务不会被取消。文档说:

任务已经完成(没有被取消),并且任务的 委托不再收到回调。如果任务完成 成功,任务的错误属性为零。否则,它提供 一个错误对象,它告诉我们出了什么问题。这种状态下的任务是 不受超时限制。

【讨论】:

我无法检查任务的状态,因为它在任务的初始化中。 你是对的。斯威夫特不允许这样做。您可以使用委托而不是基于块的完成。在URLSession:downloadTask:didFinishDownloadingToURL: 方法中,您可以检查downloadTaskstate【参考方案2】:

完成处理程序只会在任务完成时执行,因此您可以在实例化时实际使用它。为什么不利用捕获列表来强制执行弱循环:

let downloadTask = session.downloadTaskWithURL(URL, completionHandler: [weak downloadTask]  location, response, error in
    ...

请记住,处理程序中的任务状态可能是completed,因此您应该检查的是错误参数

【讨论】:

以上是关于如何在完成处理程序块中检查 NSURLSessionDownloadTask 的状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理完成处理程序块中取消的 NSURLSessionTask ?

DispatchQueue.main.async 块中未更新完成处理程序的返回值

NSURLSession 未下载完整数据,但成功完成

检查 PL/SQL 异常块中的特定错误代码

如何在单个 catch 块中处理来自工作线程和主线程的异常?

如何检查线程代码是不是在 try-catch 块中运行