如何从一个协议委托方法阻止从另一个协议执行另一个协议?

时间:2012-06-15 08:31:47

标签: objective-c nsurlconnection

具体而言,来自connectionDidFinishDownloading:destinationURL:的{​​{1}}阻止<NSURLConnectionDownloadDelegate>执行connection:DidReceiveData:。 怎么会这样?

我在命名方法中输入错误,然后只是使用Xcode自动完成拼写错误,收到<NSURLConnectionDataDelegate>而不是connectionDidFinishDownloading:destinationURL:。 然后好几天我都没意识到为什么connectionDidFinishLoading根本没被召唤。所以我修好了一切,现在问你:为什么是这样的?

回复的答案。

1 个答案:

答案 0 :(得分: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的错误。还没有修复:))

相关问题