NSURLCache使用缓存来处理早于max-age的请求

时间:2017-03-28 17:03:07

标签: ios swift caching nsurlsession nsurlcache

我现在正在试图弄清楚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?

1 个答案:

答案 0 :(得分:0)

我知道这已经太晚了,但我认为您只需要将newCachedResponse传递回提供给您的完成处理程序闭包。

如最后一行是:

completionHandler(newCachedResponse)