これは十分に文書化されていない機能です。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へのバグであることを確認しました。まだ修正されていません:)