저는 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 무엇입니까?