Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does one deal with a cancelled NSURLSessionTask in the completion handler block?

If I create a NSURLSessionDownloadTask, and later cancel it before it finishes, the completion block still fires seemingly.

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

How do I check whether or not the download task was cancelled within this block so that I don't try to operate on the resulting download when there isn't one?

like image 447
Doug Smith Avatar asked Oct 16 '14 18:10

Doug Smith


1 Answers

For download task, the completion handler will be called with nil value for the location and the code value of the URLError object will be .cancelled. For example:

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()

Or look for the code value of the NSError object of NSURLErrorCancelled:

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()

The process of casting the error parameter is the same for data tasks, as the download task above.

For Swift 2, see previous revision of this answer.

like image 119
Rob Avatar answered Oct 14 '22 15:10

Rob