2014-10-16 102 views
9

如果我创建了一个NSURLSessionDownloadTask,并且稍后在完成之前取消它,那么完成块看起来仍然会触发。如何处理完成处理程序块中取消的NSURLSessionTask?

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

如何检查下载任务是否被这个区块内取消,让我不要尝试对所得到的下载操作时,没有一个?

回答

23

对于下载任务,完成处理器将用于locationnil值和NSError对象的code值被称为将是NSURLErrorCancelled。在斯威夫特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() 

还是在斯威夫特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() 

同样,对于数据的任务,完成处理器将与Error/NSError指示是否被取消调用。在斯威夫特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() 

还是在斯威夫特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() 
+0

怎么样的一个下载任务?该位置是否为零?还是应该依靠错误? – 2014-10-17 00:29:52

+0

是的,'location'将是'nil',但是你可以检查'error',如果'code'是'NSURLErrorCancelled',你知道它由于某种原因被取消了。 – Rob 2014-10-17 00:56:59