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