NSURLCache
は、ネットワーク要求をRAMまたはディスクにキャッシュするための包括的なソリューションです。 Appleのドキュメントによると、
NSURLConnection
を使用したリクエストはすべて
NSURLCache
「通過」し
NSURLCache
。
キャッシュにより、ネットワークへの必要な呼び出しの回数が減り、インターネットが完全に存在しない場合やネットワーク接続の問題が発生している場合にプログラムを操作する印象が向上します。
サーバーの応答がダウンロードされると、その応答のコピーがローカルキャッシュに保存されます。 次に同じリクエストを送信すると、ネットワークにアクセスせずに、すぐにレスポンスが返されます。
NSURLCache
、キャッシュされたデータをユーザーに透過的に返します。
NSURLCache
を使用するには、
sharedURLCache
値を
sharedURLCache
に設定する必要があります。 これは、
application:didFinishLaunchingWithOptions:
iOSの
application:didFinishLaunchingWithOptions:
メソッドまたは
application:didFinishLaunchingWithOptions:
OS X:
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil]; [NSURLCache setSharedURLCache:URLCache]; }
キャッシュ設定は、クライアント側とサーバー側の両方で管理できます。 オプションを賢く選択すると、アプリケーションを最適化するのに役立ちます。
NSURLRequestCachePolicy
サーバー側の要求では、
cachePolicy
オブジェクトの
cachePolicy
プロパティを使用してキャッシュポリシーが設定されます。 次のオプションのいずれかを選択できます。
-
NSURLRequestUseProtocolCachePolicy
デフォルト値。 キャッシングロジックは、リクエストで使用されるネットワークプロトコルの実装によって決まります。 -
NSURLRequestReloadIgnoringLocalCacheData
データは常にサーバーからロードされ、キャッシュの内容は完全に無視されます。 -
NSURLRequestReloadIgnoringLocalAndRemoteCacheData
ローカルキャッシュの内容は無視されます。 さらに、プロキシサーバーおよびその他の中間インフラストラクチャは、可能であればデータのキャッシュコピーを使用しないように指示する必要があります。 -
NSURLRequestReturnCacheDataElseLoad
キャッシュから情報が返されますが、その関連性に関する情報は考慮されません。 キャッシュにデータがない場合は、ネットワークからロードされます。 -
NSURLRequestReturnCacheDataDontLoad
データはキャッシュから取得され、それらの陳腐化に関する情報は無視されます。 ただし、保存された情報がない場合、リクエストはサーバーから取得しようとせずに、すぐに渡されなかったと見なされます。 -
NSURLRequestReloadRevalidatingCacheData
キャッシュされたデータは、サーバーによる有効性の事前確認後にのみ使用されます。 無関係になったデータは、ネットワークから送り出されます。
これらのオプションの違いは必ずしも明らかではなく、しばしば混乱を招きます。
NSURLRequestReloadIgnoringLocalAndRemoteCacheData
と
NSURLRequestReloadRevalidatingCacheData
が原則として実装されていないことも明確になりません 。
NSURLRequestCachePolicy
について本当に知る必要があることは、次のように要約できます。
-
UseProtocolCachePolicy
デフォルトの動作 -
ReloadIgnoringLocalCacheData
キャッシュを使用しない -
ReloadIgnoringLocalAndRemoteCacheData
キャッシュを使用しません。かなり -
ReturnCacheDataElseLoad
キャッシュを使用します。 関連性に関する情報を無視する -
ReturnCacheDataDontLoad
オフラインモード。 「鮮度」に関係なく、キャッシュされたデータのみを使用する -
ReloadRevalidatingCacheData
使用する前に、サーバーにキャッシュの関連性を尋ねます
HTTPキャッシング
NSURLConnection
クラス
NSURLConnection
さまざまなネットワークプロトコル(FTPおよびHTTP / HTTPSを含む)で動作するように設計されているため、ドキュメントではプロトコルに依存しない方法でキャッシュについて説明しています。 この記事では、HTTPプロトコルの観点から検討します。
HTTPでは、サーバーの要求と応答のヘッダーを使用して、エンコード、MIMEタイプ、キャッシュなどに関するメタ情報を交換します。
リクエストヘッダー
デフォルトでは、
NSURLRequest
は現在の時刻を使用して、キャッシュされた情報を返すかどうかを決定します。 さらに微調整するには、次のヘッダーを使用できます。
-
If-Modified-Since
このヘッダーは、サーバーからの応答のLast-Modified
ヘッダーに対応します。 その値は、このサービスへの最後の呼び出しからLast-Modified
設定する必要があります。 -
If-None-Match
応答のEtag
対応します。 ここでは、以前に受け取ったEtag
値を渡す必要があります。
応答ヘッダー
NSHTTPURLResponse
、キャッシュヘッダーも返すことができます。
-
Cache-Control
クライアントでHTTPキャッシングを有効にするには、このヘッダーが応答に存在する必要があります。 その値には、キャッシュへのデータストレージの期間と、それらへのアクセスレベルに関する情報が含まれる場合があります。 詳細情報はこちらから入手できます 。
Cache-Control
加えて、サーバーは条件付きでデータを受信するために使用される追加のヘッダーを送信できます(前のセクションを参照)。
-
Last-Modified
要求されたリソースの最終変更時刻。 たとえば、フォトアルバムに関する情報を受信する場合、Last-Modified
ヘッダーは、最後の写真の日付に相当する値に設定されます。 -
Etag
必要なオブジェクトのコンテンツの識別子。 実際には、これは、たとえば、リソースのステータスのMD5ハッシュである場合があります。 これは、Last-Modified
定義に問題Last-Modified
ある動的に生成されたデータに役立ちます。
NSURLConnectionDelegate
要求の結果を処理するとき、
NSURLConnection
デリゲートは、
connection:willCacheResponse:
メソッドを使用して、キャッシュされた応答を変更
connection:willCacheResponse:
。 この
NSCachedURLResponse
オブジェクトは、この呼び出しに渡されます。この呼び出しには、ソース
NSURLResponse
への参照とキャッシュされたデータが
NSData
の形式で
NSData
ます。 このオブジェクトは、ネットワーク接続から取得した情報に基づいて作成されます。
NSCachedURLResponse
クラスのインスタンスを変更することはできないため、パラメーターを編集するには、初期化子
initWithResponse:data:userInfo:storagePolicy:
を使用して新しいオブジェクトを作成する必要があり
initWithResponse:data:userInfo:storagePolicy:
例:
-(NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse { NSMutableDictionary *mutableUserInfo = [[cachedResponse userInfo] mutableCopy]; NSMutableData *mutableData = [[cachedResponse data] mutableCopy]; NSURLCacheStoragePolicy storagePolicy = NSURLCacheStorageAllowedInMemoryOnly; // ... return [[NSCachedURLResponse alloc] initWithResponse:[cachedResponse response] data:mutableData userInfo:mutableUserInfo storagePolicy:storagePolicy]; }
connection:willCacheResponse:
メソッドが
nil
返す場合、応答はまったくキャッシュされません。
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse { return nil; }
connection:willCacheResponse:
メソッドはオプションです。 デリゲートに実装されていない場合、
NSCachedURLResponse
自動生成されたインスタンスが使用されます。
落とし穴
NSURLCache
使用する場合、いくつかの機能があります。
-
iOS 5では、 HTTPを使用せずに HTTPを使用する場合にのみディスクキャッシュが可能です。 このサポートはiOS 6で のみ実装されています。 - また、 キャッシングヘッダーを使用しないサーバーと対話する場合、いくつかのニュアンスがあります。
おわりに
NSURLCache
例は、使用しているシステムの機能を知ることがいかに重要かを示しています。
多くの開発者は
NSURLCache
の機能を認識していないため、独自のバイクを発明してキャッシュを整理します
NSURLCache
の初期化は2行のコードのみで、作業を100倍効率的にします。 さらに、ネットワークキャッシングの利点を考えず、それを使用しないで、大量の不要な要求をサーバーにロードします。
したがって、アプリケーションのパフォーマンスを最適化
NSURLCache
は、
application:didFinishLaunchingWithOptions:
NSURLCache
を常に初期化してください
application:didFinishLaunchingWithOptions:
メソッド。