2017-03-28 1 views
1

저는 NSURLCache로 무슨 일이 벌어지는 지 알아 내려고 노력하고 있습니다.NSURLCache는 최대 연령보다 오래된 요청에 대해 캐시를 사용합니다.

기본적으로 연결하려는 서버는 캐시 제어 헤더를 설정하지 않습니다 ... 따라서 다양한 가이드와 사과 문서 (예 : https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/URLLoadingSystem/Concepts/CachePolicies.html)를 따르고 willCacheResponse 델리게이트에 내 자신의 캐시 제어 헤더를 설정 한 다음 그 값을 반환합니다 완료 핸들러의 응답. 애플 워드 프로세서와 제가 읽은 자료는 이것이 제대로 작동해야 함을 나타냅니다. 하지만 내가 본 것은 캐시 된 데이터가 max-age를 기준으로 만료 된 후에 반환된다는 것입니다. max-age가 무시되는 것처럼 보이고 NSURLCache는 캐시에서 데이터를 가져와야하는지 아닌지를 결정하기 위해 다른 경험적 방법을 사용합니다.

max-age = 60 캐시 제어 헤더를 설정하고 데이터를 캐시에서 가져오고 60 초 후에 네트워크 요청이 오래 걸리지 않는다는 것을 Charles가 확인했습니다. 궁극적으로 (비 결정적 인 것처럼 보입니다.) 새로운 요청이 실제로 서버로갑니다. (대개 몇 시간이 지난 후 요청을 다시 시도합니다.) 여기

테스트 목적으로 난 그냥 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에 응답 오전 반환 캐시 제어 헤더가 max-age = 60으로 설정되어 있습니다. 나는 여기서 분명히 잘못된 것을하고 있습니까? 또는 NSURLCache 그냥 F'd 무엇입니까?

답변

0

나는 이것이 매우 늦었다 고 알고있다. 그러나 나는 당신에게 제공된 newCachedResponse를 완료 핸들러 클로저로 다시 전달하면된다고 생각한다.

이러한 마지막 행의 존재로 :

completionHandler(newCachedResponse) 
관련 문제