11

URL 読み込みフレームワークを使用して、キャッシュを利用して URL を読み込む方法を見つけようとしています。

私は NSURLConnections を使用しており、それらに NSURLRequests を供給しています。これらのリクエストの cachePolicy を NSURLRequestReturnCacheDataElseLoad に設定しました。初めてリクエストをロードすると、自動的にキャッシュに入れられます([NSURLCache sharedCache]持っています)。しかし、次に同じリクエストをロードすると、NSURLConnection はキャッシュの内容を無視してデータをリロードするようです。

手動でキャッシュ ルックアップを実装し、キャッシュされたデータを返さなければならないのでしょうか? NSURLConnection はこれを行いませんか? または、フレームワークがキャッシュをシームレスに使用できるようにする方法はありますか?

更新:成功せずに次のことを試しました:

  • リクエストキャッシュポリシーをNSURLRequestReturnCacheDataElseLoad代わりに設定するNSURLRequestUseProtocolCachePolicy
  • 新しいリクエスト オブジェクトを作成する代わりに、リクエスト オブジェクトを再利用する
  • +[NSURLConnection sendSynchronousRequest:returningResponse:error:]非同期ロードの代わりに使用
4

3 に答える 3

6

iOS 5 以降では、メモリとディスク容量の両方を持つ sharedURLCache が提供されます

NSURLCache にある程度の容量を設定しない限り、何もキャッシュされません。

// A 10MB cache. This a good avatar-image-cache size but might be too 
// large for your app's memory requirements. YMMV.
[[NSURLCache sharedURLCache] setMemoryCapacity:1024*1024*10];

デフォルトの iPhone NSURLCache インスタンスは、ディスクへのキャッシュを拒否します。この動作が必要な場合は、NSURLCache をサブクラス化し、独自のディスク キャッシュを実装する必要があります。GitHub でディスク キャッシュの例を数多く見つけましたが、完全に必要な「プルーニング」ステップを十分に行っているものはありません。

于 2010-10-10T13:12:55.087 に答える
0

実際、少なくともいくつかの状況では、NSURLCache を自動的に使用します。確かに、次のコードで行います。

編集 - iPhone ではなく、OS X 10.6 Cocoa アプリで動作します (誤解された質問)

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {

    // run request with default cache policy
 NSMutableURLRequest *req=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://en.wikipedia.org/"]];
 NSData *data=[NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil];
 NSLog(@"Received %d bytes", [data length]);

 sleep(10);

    // now run it asking it to use the cache
 [req setCachePolicy:NSURLRequestReturnCacheDataElseLoad];
 data=[NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil];
 NSLog(@"Received %d bytes", [data length]);

    return 0;
}
于 2009-12-10T23:24:17.090 に答える