16

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

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

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

4

1 回答 1

35

对于下载任务,将使用 的nil值调用完成处理程序,对象locationcode值为。例如:URLError.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()

或者查找的对象的code值:NSErrorNSURLErrorCancelled

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,请参阅此答案的先前版本

于 2014-10-16T18:35:22.620 回答