Ios NSURLCache使用缓存处理早于最大年龄的请求
我一直在用我的头来撞击,而现在我正试图弄清楚NSURLCache到底发生了什么 基本上,我连接的服务器不设置任何缓存控制头。。。因此,遵循各种指南和apple文档(ie),我在willCacheResponse委托中设置了自己的缓存控制头,然后在完成处理程序中返回修改后的响应。苹果的文档和我读到的资源似乎表明这应该是可行的。但我看到的是,缓存的数据在根据最大年龄过期后返回。似乎max age被忽略了,NSURLCache正在使用另一种启发式方法来确定是否应该从缓存中提取数据 我设置了max age=60 cache-control报头,并使用Charles验证了数据是从缓存中提取的,并且在60秒后很久不会发出任何网络请求。最终(似乎是不确定的)将发出一个新的请求,该请求将实际发送到服务器(通常在几个小时后,我会再次尝试该请求) 以下是代码,出于测试目的,我只是将最大年龄硬编码为60秒:Ios NSURLCache使用缓存处理早于最大年龄的请求,ios,swift,caching,nsurlsession,nsurlcache,Ios,Swift,Caching,Nsurlsession,Nsurlcache,我一直在用我的头来撞击,而现在我正试图弄清楚NSURLCache到底发生了什么 基本上,我连接的服务器不设置任何缓存控制头。。。因此,遵循各种指南和apple文档(ie),我在willCacheResponse委托中设置了自己的缓存控制头,然后在完成处理程序中返回修改后的响应。苹果的文档和我读到的资源似乎表明这应该是可行的。但我看到的是,缓存的数据在根据最大年龄过期后返回。似乎max age被忽略了,NSURLCache正在使用另一种启发式方法来确定是否应该从缓存中提取数据 我设置了max ag
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上的响应将cache-control头设置为max-age=60。我是不是做错了什么?或者NSURLCache只是F'd?我知道这太晚了,但我认为您只需要将新的cachedResponse传递回提供给您的完成处理程序闭包中 例如,最后一行是:
completionHandler(newCachedResponse)