iOSのネットワークキャッシュ。 NSURLCache

このトピックは、ネットワークと対話するアプリケーションを開発するときに重要です。 ここでは、システム機能を適切に使用することで、プログラムとのユーザーの対話を大幅に改善できます。

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プロパティを使用してキャッシュポリシーが設定されます。 次のオプションのいずれかを選択できます。

これらのオプションの違いは必ずしも明らかではなく、しばしば混乱を招きます。 NSURLRequestReloadIgnoringLocalAndRemoteCacheDataNSURLRequestReloadRevalidatingCacheDataが原則として実装されていないことも明確になりません

NSURLRequestCachePolicyについて本当に知る必要があることは、次のように要約できます。

HTTPキャッシング


NSURLConnectionクラスNSURLConnectionさまざまなネットワークプロトコル(FTPおよびHTTP / HTTPSを含む)で動作するように設計されているため、ドキュメントではプロトコルに依存しない方法でキャッシュについて説明しています。 この記事では、HTTPプロトコルの観点から検討します。

HTTPではサーバーの要求と応答のヘッダーを使用して、エンコード、MIMEタイプ、キャッシュなどに関するメタ情報を交換します。

リクエストヘッダー

デフォルトでは、 NSURLRequestは現在の時刻を使用して、キャッシュされた情報を返すかどうかを決定します。 さらに微調整するには、次のヘッダーを使用できます。

応答ヘッダー

NSHTTPURLResponse 、キャッシュヘッダーも返すことができます。

Cache-Control加えて、サーバーは条件付きでデータを受信するために使用される追加のヘッダーを送信できます(前のセクションを参照)。

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使用する場合、いくつかの機能があります。

おわりに


NSURLCache例は、使用しているシステムの機能を知ることがいかに重要かを示しています。

多くの開発者はNSURLCacheの機能を認識していないため、独自のバイクを発明してキャッシュを整理しますNSURLCacheの初期化は2行のコードのみで、作業を100倍効率的にします。 さらに、ネットワークキャッシングの利点を考えず、それを使用しないで、大量の不要な要求をサーバーにロードします。

したがって、アプリケーションのパフォーマンスを最適化NSURLCacheは、 application:didFinishLaunchingWithOptions: NSURLCacheを常に初期化してくださいapplication:didFinishLaunchingWithOptions:メソッド。

Source: https://habr.com/ru/post/J179349/


All Articles