2017-03-28 4 views
1

私は今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ですか?

答えて

0

私はこれが非常に遅いことを知っていますが、私はあなたに提供された補完ハンドラのクロージャにそのnewCachedResponseを戻す必要があると思います。

completionHandler(newCachedResponse) 
:このような最後の行であるとして

関連する問題