Swift 为什么NSURLSessionTask.error和didCompleteWithError委托?

Swift 为什么NSURLSessionTask.error和didCompleteWithError委托?,swift,swift2,nsurlsession,nsurlsessiondownloadtask,Swift,Swift2,Nsurlsession,Nsurlsessiondownloadtask,我在一个循环中启动许多下载,并将所有启动的下载放在一个数组中以跟踪它们 成功完成后,我将从阵列中删除downloadTask: internal func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) { internal func URLSession(session: NSURLSession, down

我在一个循环中启动许多下载,并将所有启动的下载放在一个数组中以跟踪它们

成功完成后,我将从阵列中删除downloadTask:

internal func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
internal func URLSession(session: NSURLSession, downloadTask: NSURLSessionTask, didCompleteWithError error: NSError?) {
然后,DownloadTask也可能失败,因此我也将其从阵列中删除:

internal func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
internal func URLSession(session: NSURLSession, downloadTask: NSURLSessionTask, didCompleteWithError error: NSError?) {
但有时一些下载会留在数组中,然后我发现剩下的下载有一个带有
unknown Error
的Error属性。但是为什么它没有在
didpletewarror
中触发,像这样我必须检查两个地方的错误

这对我来说不是什么问题,我只是想知道


为了扩展我的问题,我还看到您可以使用
completionHandler
或这些
委托
我应该使用哪一个?这是一些赞成/反对意见。就我个人而言,我更喜欢completionHandler,因为我将所有代码放在一个地方,这将为我节省一些行。

重新完成处理程序模式:是的,这通常更容易,但如果使用后台会话,则必须使用委托协议模式……重新完成处理程序模式:是的,这通常更容易,但如果您使用的是后台会话,则必须使用委托协议模式。。。