1

具体来说,connectionDidFinishDownloading:destinationURL:from<NSURLConnectionDownloadDelegate>阻止执行connection:DidReceiveData:from <NSURLConnectionDataDelegate>。怎么会这样?

我在命名方法上输入错误,然后用 Xcode 自动完成拼写错误,connectionDidFinishDownloading:destinationURL:而不是connectionDidFinishLoading. 然后有几天我不明白为什么connection:DidReceiveData:根本没有打电话。所以我把所有东西都修好了,现在问你:为什么会这样?

谢谢回复。

4

1 回答 1

4

这是一个没有很好记录的功能。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 的错误。仍未修复:)

于 2013-06-28T16:38:44.857 回答