¿Cómo se maneja una NSURLSessionTask cancelada en el bloque de event handling finalización?

Si creo un NSURLSessionDownloadTask , y más tarde lo cancelo antes de que termine, el bloque de finalización todavía se dispara aparentemente.

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

¿Cómo verifico si la tarea de descarga se canceló o no dentro de este bloque para que no intente operar con la descarga resultante cuando no hay una?

Para la tarea de descarga, el controller de finalización se llamará con un valor nil para la location y el valor del code del object NSError será NSURLErrorCancelled . En Swift 3:

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

O en Swift 2:

 let task = session.downloadTaskWithURL(url) { location, response, error in if let error = error { if error.code == NSURLErrorCancelled { // canceled } else { // some other error } return } // proceed to move file at `location` to somewhere more permanent } task.resume() 

Del mismo modo para las tareas de datos, se llamará al manejador de finalización con un Error / NSError que indique si se canceló. En Swift 3:

 let task = session.dataTask(with: url) { data, 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() 

O en Swift 2:

 let task = session.dataTaskWithURL(url) { data, response, error in if let error = error { if error.code == NSURLErrorCancelled { // canceled } else { // some other error } return } // otherwise handler data here } task.resume()