1

具体的には、connectionDidFinishDownloading:destinationURL:from<NSURLConnectionDownloadDelegate>の実行の防止connection:DidReceiveData:から<NSURLConnectionDataDelegate>。どうして?

命名方法の入力を間違えた後、Xcodeでタイプミスを自動完了し、connectionDidFinishDownloading:destinationURL:の代わりに受信しましたconnectionDidFinishLoading。それから数日間、なぜconnection:DidReceiveData:まったく呼ばれなかったのか理解できませんでした。だから私はすべてを修理しました、そして今あなたに尋ねます:それはなぜですか?

応答のためのThx。

4

1 に答える 1

4

これは十分に文書化されていない機能です。NSURLConnectionには、NSURLConnectionDataDelegateとNSURLConnectionDownloadDelegateの2つの異なるデリゲートプロトコルがあります。

  • NSURLConnectionDataDelegate:データをメモリにロードするために使用されるデリゲートメソッド。これらのデリゲートメソッドはすべてオプションです。
  • NSURLConnectionDownloadDelegate:リソースのダウンロードをディスクファイルに直接実行するために使用されるメソッドを委任します。connectionDidFinishDownloading:destinationURL:を除いて、すべてのメソッドはオプションです。これは、ダウンロードが終了した場所をデリゲートに通知するために実装する必要があります。

ご覧のとおり、デリゲートにconnectionDidFinishDownloading:destinationURL:を実装した場合。これにより、NSDataとしてメモリ以外のディスクファイルにデータをダウンロードするようにNSURLConnectionに通知されます。ターゲットディスクファイルはアプリケーションのキャッシュディレクトリにあり、デリゲートコールバックの期間中は存在することが保証されています。つまり、デリゲートはダウンロードをより永続的な場所にコピーまたは移動する必要があります。

したがって、デリゲートクラスの実装からconnectionDidFinishDownloading:destinationURL:を削除すると、代わりにconnection:DidReceiveData:が呼び出されます。

しかし、これが最後の話ではありません。connectionDidFinishDownloading:destinationURL:を実装し、destinationURLを介してダウンロードしたファイルにアクセスしたい場合。残念ながら、ファイルはありません。おっと、デリゲートコールバックはニューススタンドアプリ用です。Info.plistで指定しているときにニューススタンドアプリを開発していない場合は、NSURLConnectionDownloadDelegateに近づかないでください。Appleは、これがiOS5からiOS7へのバグであることを確認しました。まだ修正されていません:)

于 2013-06-28T16:38:44.857 に答える