2012-06-15 105 views
1

具體而言,connectionDidFinishDownloading:destinationURL:<NSURLConnectionDownloadDelegate>阻止從<NSURLConnectionDataDelegate>執行connection:DidReceiveData:。 怎麼可能?如何委託來自一個協議的方法阻止另一個協議執行另一個協議?

我在命名方法中輸入錯誤,然後用Xcode自動完成拼寫錯誤,收到connectionDidFinishDownloading:destinationURL:而不是connectionDidFinishLoading。 然後好幾天我都沒有意識到爲什麼connection:DidReceiveData:根本沒有被調用。所以我修好了一切,現在問你:爲什麼是?

Thx for responses。

回答

4

這是一個沒有很好記錄的功能。 NSURLConnection有兩個不同的委託協議:NSURLConnectionDataDelegate和NSURLConnectionDownloadDelegate。

  • NSURLConnectionDataDelegate:用於將數據加載到內存的委託方法。這些委託方法都是可選的。
  • NSURLConnectionDownloadDelegate:用於執行資源直接下載到磁盤文件的委託方法。除了connectionDidFinishDownloading之外,所有的方法都是可選的:destinationURL:必須實現它才能通知代理完成下載的位置。

如您所見,如果您在代理中實現了connectionDidFinishDownloading:destinationURL:。這將通知NSURLConnection您想要將數據下載到磁盤文件而不是內存中作爲NSData。目標磁盤文件位於應用程序緩存目錄中,並且在代理回調期間保證存在。這意味着代理應該將下載複製或移動到更持久的位置。

所以,如果你消除connectionDidFinishDownloading:destinationURL:從你的委託類實現,連接:DidReceiveData:將被調用。

這是不是最後的故事。當你實現connectionDidFinishDownloading:destinationURL:然後想通過destinationURL訪問下載的文件時。不幸的是,該文件不存在。需要注意的是,代表回撥是針對Newsstand應用的。如果您在Info.plist中指定的時候沒有開發報刊應用,請遠離NSURLConnectionDownloadDelegate。蘋果證實這是從iOS 5到iOS 7的一個bug。仍然沒有修復:)

+0

哇。你從哪裏得到這些信息?哇。 – folex