【发布时间】:2017-08-21 21:17:49
【问题描述】:
我一直在努力想弄清楚 NSURLCache 发生了什么。
基本上,我要连接的服务器没有设置任何缓存控制标头...因此,按照各种指南和苹果文档(即https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/URLLoadingSystem/Concepts/CachePolicies.html),我在 willCacheResponse 委托中设置了自己的缓存控制标头,然后返回完成处理程序中的修改响应。苹果文档和我读过的资源似乎表明这应该有效。但是我看到的是缓存的数据在它应该基于max-age过期后返回。似乎 max-age 被忽略了,并且 NSURLCache 正在使用另一种启发式方法来确定它是否应该从缓存中提取数据。
我设置了 max-age=60 缓存控制标头,并使用 Charles 验证数据是从缓存中提取的,并且在 60 秒后很长时间没有发出任何网络请求。最终(似乎是不确定的)会发出一个新请求,该请求实际上会发送到服务器(通常在几个小时过去后,我会再次尝试该请求)。
这是代码,出于测试目的,我只是将 max-age 硬编码为 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 响应的缓存控制标头设置为 max-age=60。我在这里做明显错误的事情吗?还是 NSURLCache 只是 F'd?
【问题讨论】:
标签: ios swift caching nsurlsession nsurlcache