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



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



これらのオプションの違いは必ずしも明らかではなく、しばしば混乱を招きます。 NSURLRequestReloadIgnoringLocalAndRemoteCacheData



NSURLRequestReloadRevalidatingCacheData



が原則として実装されていないことも明確になりません



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:



メソッド。



All Articles