Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSURLCache使用缓存处理早于最大年龄的请求_Ios_Swift_Caching_Nsurlsession_Nsurlcache - Fatal编程技术网

Ios NSURLCache使用缓存处理早于最大年龄的请求

Ios NSURLCache使用缓存处理早于最大年龄的请求,ios,swift,caching,nsurlsession,nsurlcache,Ios,Swift,Caching,Nsurlsession,Nsurlcache,我一直在用我的头来撞击,而现在我正试图弄清楚NSURLCache到底发生了什么 基本上,我连接的服务器不设置任何缓存控制头。。。因此,遵循各种指南和apple文档(ie),我在willCacheResponse委托中设置了自己的缓存控制头,然后在完成处理程序中返回修改后的响应。苹果的文档和我读到的资源似乎表明这应该是可行的。但我看到的是,缓存的数据在根据最大年龄过期后返回。似乎max age被忽略了,NSURLCache正在使用另一种启发式方法来确定是否应该从缓存中提取数据 我设置了max ag

我一直在用我的头来撞击,而现在我正试图弄清楚NSURLCache到底发生了什么

基本上,我连接的服务器不设置任何缓存控制头。。。因此,遵循各种指南和apple文档(ie),我在willCacheResponse委托中设置了自己的缓存控制头,然后在完成处理程序中返回修改后的响应。苹果的文档和我读到的资源似乎表明这应该是可行的。但我看到的是,缓存的数据在根据最大年龄过期后返回。似乎max age被忽略了,NSURLCache正在使用另一种启发式方法来确定是否应该从缓存中提取数据

我设置了max age=60 cache-control报头,并使用Charles验证了数据是从缓存中提取的,并且在60秒后很久不会发出任何网络请求。最终(似乎是不确定的)将发出一个新的请求,该请求将实际发送到服务器(通常在几个小时后,我会再次尝试该请求)

以下是代码,出于测试目的,我只是将最大年龄硬编码为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上的响应将cache-control头设置为max-age=60。我是不是做错了什么?或者NSURLCache只是F'd?

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

例如,最后一行是:

completionHandler(newCachedResponse)