来自一个协议的委托方法如何防止从另一个协议执行另一个方法



具体来说,<NSURLConnectionDownloadDelegate> connectionDidFinishDownloading:destinationURL:阻止了<NSURLConnectionDataDelegate>执行connection:DidReceiveData:。怎么可能?

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

感谢回复。

这是一个没有充分记录的功能。NSURLConnection 有两种不同的委托协议:NSURLConnectionDataDelegate 和 NSURLConnectionDownloadDelegate。

  • NSURLConnectionDataDelegate:用于将数据加载到内存的委托方法。 这些委托方法都是可选的。
  • NSURLConnectionDownloadDelegate:用于将资源直接下载到磁盘文件的委托方法。 所有方法都是可选的,但 connectionDidFinishDownloading:destinationURL:必须实现它才能通知委托完成下载的位置。

如您所见,如果您在委托中实现了 connectionDidFinishDownloading:destinationURL: 。这将通知 NSURLConnection 您希望将数据下载到磁盘文件而不是作为 NSData 下载到内存。目标磁盘文件位于应用程序缓存目录中,并保证在委托回调期间存在。这意味着委托应将下载内容复制或移动到更持久的位置。

因此,如果您从委托类实现中消除 connectionDidFinishDownloading:destinationURL:,则 connection:DidReceiveData: 将被调用。

这怎么不是最后一个故事。当您实现 connectionDidFinishDownloading:destinationURL: 时,然后想要通过 destinationURL 访问下载的文件。不幸的是,该文件不存在。知道了,代表回调适用于报亭应用程序。如果您在 Info.plist 中指定时没有开发报亭应用程序,请远离 NSURLConnectionDownloadDelegate。苹果证实这是从iOS 5到iOS 7的错误。仍然没有修复:)