iPhone で NSURLConnection 非同期接続を使用したリクエスト キャッシュに小さな問題があります。何かを間違って理解しているのか、それとも Cocoa が本来の動作とは逆のことを行っているのかはわかりません...
NSURLRequest のドキュメントには、次のように記載されています。
NSURLRequestReloadIgnoringLocalCacheData
URL ロードのデータを元のソースからロードする必要があることを指定します。URL ロード要求を満たすために、既存のキャッシュ データを使用しないでください。
と:
NSURLRequestReloadIgnoringLocalAndRemoteCacheData
ローカル キャッシュ データを無視するだけでなく、プロトコルで許可されている限り、プロキシやその他の中間体にキャッシュを無視するように指示する必要があることを指定します。
ここで、NSURLRequestReloadIgnoringLocalCacheData (ローカル キャッシュを無視することになっていますが、利用可能な場合はリモート キャッシュを使用することになっています) で NSURLRequest を送信すると、送信されるヘッダーは次のようになります。
GET /ダッシュボード HTTP/1.1 ユーザーエージェント: XBlip1.0 CFNetwork/422.15.2 Darwin/9.6.0 (i386) (iMac8%2C1) X ブリップ API: 0.02 受け入れる: アプリケーション/json 認可: 基本 (...) Accept-Language: en-us Accept-Encoding: gzip、デフレート 接続: キープアライブ ホスト: api.blip.pl
そして、ステータスは 200 OK です。しかし、名前が示すように、ローカル キャッシュとリモート キャッシュの両方を無視することになっている NSURLRequestReloadIgnoringLocalAndRemoteCacheData を使用すると、ヘッダーが 1 つ追加されます。
一致しない場合: "d751713988987e9331980363e24189ce"
応答は 304 Not Modified です。HTTP RFC を確認したところ、「If-None-Match」については次のように書かれています。
エンティティ タグのいずれかが、そのリソースの同様の GET 要求 (If-None-Match ヘッダーなし) への応答で返されるエンティティのエンティティ タグと一致する場合、(...) サーバーは、してはなりません (MUST NOT)。要求されたメソッドを実行する (...) 代わりに、要求メソッドが GET または HEAD の場合、サーバーは 304 (Not Modified) 応答で応答する必要があります (SHOULD)。
したがって、リモート キャッシュを無視する代わりに NSURLRequestReloadIgnoringLocalAndRemoteCacheData を使用すると、Cocoa はリモート サーバーにリモート キャッシュを使用するように明示的に指示し、NSURLRequestReloadIgnoringLocalCacheData を使用すると、その行は追加されず、実際にはリモート キャッシュは追加されません。使用済み。
では、ここで何が起こっているのでしょうか。何か見逃していましたか、それとも Cocoa が間違ったヘッダーを設定していますか?