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

Posted

技术标签:

【中文标题】如何处理完成处理程序块中取消的 NSURLSessionTask ?【英文标题】:How does one deal with a cancelled NSURLSessionTask in the completion handler block? 【发布时间】:2014-10-16 18:27:55 【问题描述】:

如果我创建一个NSURLSessionDownloadTask,然后在它完成之前取消它,完成块似乎仍然会触发。

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

如何检查下载任务是否在此块内被取消,以便在没有下载任务时不会尝试对结果下载进行操作?

【问题讨论】:

【参考方案1】:

对于下载任务,将使用locationnil 值调用完成处理程序,URLError 对象的code 值将是.cancelled。例如:

let task = session.downloadTask(with: url)  location, response, error in
    if let error = error as? URLError 
        if error.code == .cancelled 
            // canceled
         else 
            // some other error
        
        return
    
    
    // proceed to move file at `location` to somewhere more permanent

task.resume()

或者查找NSURLErrorCancelledNSError对象的code值:

let task = session.downloadTask(with: url)  location, response, error in
    if let error = error as NSError? 
        if error.code == NSURLErrorCancelled 
            // canceled
         else 
            // some other error
        
        return
    
    
    // proceed to move file at `location` to somewhere more permanent

task.resume()

数据任务的error参数的转换过程与上面的下载任务相同。

对于 Swift 2,请参阅 previous revision of this answer。

【讨论】:

下载任务怎么样?位置会为零吗?还是我应该只依赖错误? 是的,location 将是 nil,但您可以检查 error,如果 codeNSURLErrorCancelled,您知道它已因某种原因被取消.

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

淘集集免费打单,如何处理任务单?

如何处理本机模式取消/错误事件(cordova-plugin-purchase)?

如果用户取消 InApp 购买或只是另一个失败状态,如何处理

如何处理取消的定期付款

如何处理 JOptionPane 中的取消按钮

如何处理位置服务弹出警报上的“取消”按钮