NSURLCache
を直接クエリするとキャッシュされた応答が表示されますが、同じリソースをNSURLSession:dataTaskWithRequest
で要求すると、常にサーバーに照会され、インターネットが無効の場合でもキャッシュレスポンスは表示されません。キャッシュされた応答を使用しないNSURLSession
私はこのようなapplication:didFinishLaunchingWithOptions
でNSURLCache
を設定します。その後、私はキャッシュをチェックし、応答を取得するために、このコードを使用しています
let URLCache = NSURLCache(memoryCapacity: 20 * 1024 * 1024,
diskCapacity: 80 * 1024 * 1024, diskPath: nil)
NSURLCache.setSharedURLCache(URLCache)
:
print("cached response is \(NSURLCache.sharedURLCache().cachedResponseForRequest(request)?.response)")
NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in
print("nsurlsession response \(response)")
}.resume()
私のデバッグプリントの結果は以下のとおりです。
cached response is Optional(<NSHTTPURLResponse: 0x7f809d0ddfe0> { URL: https://api.test.com/stuff } { status code: 200, headers {
"Cache-Control" = "public, s-maxage=600";
Connection = "keep-alive";
"Content-Type" = "application/json";
Date = "Tue, 06 Sep 2016 23:41:24 GMT";
Etag = "\"4800a836fee27c56a3cce1f0f2bddaefa5a7785b\"";
Server = "nginx/1.11.3";
"Transfer-Encoding" = Identity;
"X-RateLimit-Limit" = 60;
"X-RateLimit-Remaining" = 2; } })
nsurlsession response Optional(<NSHTTPURLResponse: 0x7f809d202e50> { URL: https://api.test.com/stuff } { status code: 200, headers {
"Cache-Control" = "public, s-maxage=600";
Connection = "keep-alive";
"Content-Type" = "application/json";
Date = "Tue, 06 Sep 2016 23:51:52 GMT";
Etag = "\"4800a836fee27c56a3cce1f0f2bddaefa5a7785b\"";
Server = "nginx/1.11.3";
"Transfer-Encoding" = Identity;
"X-RateLimit-Limit" = 60;
"X-RateLimit-Remaining" = 52; } })
ご覧のとおり、キャッシュ制御ヘッダーはサーバーはキャッシュを許可するように設定されています。私は私の要求に特別なことはしていません。ちょうどURLを持つデフォルトのNSURLRequest
を作成しています。リクエストをトリガするたびに、新しいレスポンスがキャッシュされますが、それ以降のリクエストでは取得されません。
NSURLSession
がNSURLCache
に格納された応答を使用しない理由はありますか? NSURLSession
にキャッシュ内のリクエストを実際に検索するように指示する必要がありますか?
ありがとうございました。フロントエンドのエンジニアとして、ネットワークの問題が発生する可能性があるすべての場所を把握することは非常に困難です。クライアントの設定に関する問題を解消するためにTVDB URLを打つことを試みました。そのためにキャッシュが機能するので、ETagの再検証に問題があると思われます。 – NewShelbyWoo
ETag検証中にサーバーが304を送信していないことが判明しました。チャールズの代理人と確認して修正しました。私は、応答が古くなる前にクライアントが検証を試みることに気づいていませんでした。 – NewShelbyWoo
ニート。喜んで助けた。 – dgatwood