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:
      
      メソッド。