【问题标题】:How do I check the state of a NSURLSessionDownloadTask in the completion handler block?如何在完成处理程序块中检查 NSURLSessionDownloadTask 的状态?
【发布时间】:2014-10-16 13:46:43
【问题描述】:

假设我创建了一个NSURLSessionDownloadTask

let downloadTask = session.downloadTaskWithURL(URL, completionHandler: { location, response, error in
    ...
}

如果我稍后在该 downloadTask 上调用 cancel(),它仍会调用完成处理程序,对吗?我想检查下载任务的状态是否为Cancelling,这样它就不会试图弄乱下载的图像,在这种情况下不会有。

我无法检查下载任务本身的状态,因为它在变量的创建过程中。

【问题讨论】:

  • 您找到解决方案了吗?

标签: ios cocoa-touch swift nsurlsession nsurlsessiondownloadtask


【解决方案1】:

检查完成处理程序中的error 参数。或查看NSURLSessionTaskstate 属性。如果它等于 'NSURLSessionTaskState.Completed' 则下载任务不会被取消。文档说:

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

【讨论】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多