这是一个没有很好记录的功能。NSURLConnection 有两种不同的委托协议:NSURLConnectionDataDelegate 和 NSURLConnectionDownloadDelegate。
- NSURLConnectionDataDelegate:用于将数据加载到内存的委托方法。这些委托方法都是可选的。
- NSURLConnectionDownloadDelegate:用于直接将资源下载到磁盘文件的委托方法。所有方法都是可选的,除了 connectionDidFinishDownloading:destinationURL: 必须实现它以便通知代理完成下载的位置。
如您所见,如果您在委托中实现了 connectionDidFinishDownloading:destinationURL:。这将通知 NSURLConnection 你想要将数据下载到磁盘文件而不是内存作为 NSData。目标磁盘文件位于应用程序缓存目录中,并保证在委托回调期间存在。这意味着代理应该将下载内容复制或移动到更持久的位置。
因此,如果您从委托类实现中消除 connectionDidFinishDownloading:destinationURL: ,则将调用 connection:DidReceiveData: 。
这不是最后一个故事。当您实现 connectionDidFinishDownloading:destinationURL: 然后想通过destinationURL访问下载的文件时。不幸的是,该文件不存在。明白了,委托回调适用于报亭应用。如果您在 Info.plist 中指定时没有开发报亭应用程序,请远离 NSURLConnectionDownloadDelegate。Apple 确认这是从 iOS 5 到 iOS 7 的错误。仍未修复:)