このトピックは、ネットワークと対話するアプリケーションを開発するときに重要です。 ここでは、システム機能を適切に使用することで、プログラムとのユーザーの対話を大幅に改善できます。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;
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:メソッド。