NSURLSession委托和completionHandler

我正在使用NSURLSession + NSURLDownloadTask with completionHandler:

[session downloadTaskWithURL:downloadURL completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) 

它工作很好。

但是当我想跟踪进度栏中的下载时,我遇到了问题。 我正在尝试使用NSURLSessionDownloadDelegate来跟踪加载。 与上面的完成处理程序,它永远不会被称为?

使用:

  NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithURL:downloadURL]; 

会打电话给代表。

有没有办法使用completionHandler和委托?
或者使用completionHandler跟踪下载的任何其他方式?

要使用didWriteData方法,你必须使用downloadTaskWithURL而不使用completionHandler ,然后实现你自己的URLSession:downloadTask:didFinishDownloadingToURL:执行你在完成处理程序中完成的操作。

这有点烦人(特别是因为NSURLSessionDownloadDelegate设置在会话对象),但它是如何工作的。

从文档 :

NSURLSession以两种方式之一返回数据,具体取决于您调用的方法:

  • 当传输成功完成或发生错误时,将数据返回到应用程序的完成处理程序块。
  • 在收到数据时调用自定义委托上的方法。

两种方法之一。 要么使用完成处理程序(如果你想要的最后通知) 使用委托方法(如果你想要完整的信息)。 不是问题。 这不像委托方法很难使用或任何东西; 它可能只是总是更好地使用它们。