私は今NSURLCacheで何が起こっているのか把握しようとしています。NSURLCacheはmax-ageより古いリクエストにキャッシュを使用しています
基本的に、私は任意のキャッシュ制御ヘッダーを設定しないために接続していサーバー...だから私はwillCacheResponseデリゲートで自分のキャッシュ制御ヘッダーを設定して、それが修正返す(すなわちhttps://developer.apple.com/library/content/documentation/Cocoa/Conceptual/URLLoadingSystem/Concepts/CachePolicies.html)様々なガイドとリンゴのドキュメント以下完了ハンドラの応答。 Appleのドキュメントと私が読んだリソースは、これがうまくいくはずであることを示しているようです。しかし、私が見ていることは、キャッシュされたデータがmax-ageに基づいて期限切れになった後に返されるということです。 max-ageは無視され、NSURLCacheは別のヒューリスティックを使用してキャッシュからデータを取得するかどうかを判断しているようです。
私はmax-age = 60のキャッシュコントロールヘッダーを設定しました。チャールズを使用してデータがキャッシュから取得され、60秒後にネットワーク要求が長く行われないことを確認しました。最終的に(非決定論的なように見える)新しいリクエストが実際にサーバーに送信されます(通常、数時間が経過してからリクエストを再試行します)。
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, willCacheResponse proposedResponse: CachedURLResponse, completionHandler: @escaping (CachedURLResponse?) -> Void) {
var modifiedReponse: URLResponse? = nil
if let HTTPResponse = proposedResponse.response as? HTTPURLResponse {
if var newHeaders = HTTPResponse.allHeaderFields as? [String : String] {
if newHeaders["Cache-Control"] == nil {
newHeaders["Cache-Control"] = "max-age=60"
}
modifiedReponse = HTTPURLResponse(url: HTTPResponse.url!, statusCode: HTTPResponse.statusCode, httpVersion: "HTTP/1.1", headerFields: newHeaders)
}
}
let response = modifiedReponse ?? proposedResponse.response
var newCachedResponse: CachedURLResponse? = nil
newCachedResponse = CachedURLResponse(response: response, data: proposedResponse.data, storagePolicy: proposedResponse.storagePolicy)
}
あり、いくつかのオプションのチェックがそこにあるが、私はnewCachedResponse Iに応答することが確認されている。ここで
コードは、私はちょうど60秒に最大エージングをハードコーディングしていますテスト目的のために、ありますキャッシュ制御ヘッダーがmax-age = 60に設定されています。私はここで間違って何かをしていますか?またはNSURLCacheはちょうどF'dですか?