Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.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忽略304(未修改)响应上的“最大年龄”_Ios_Macos - Fatal编程技术网

Ios NSURLCache忽略304(未修改)响应上的“最大年龄”

Ios NSURLCache忽略304(未修改)响应上的“最大年龄”,ios,macos,Ios,Macos,当收到状态代码为200的响应时,NSURLCache会正确更新,并在缓存策略中考虑最大年龄 如果缓存已过期,如果自起修改,则它也会使用;如果不匹配,则使用正确发送条件请求,如果之前检索到了相应的头。 如果现在服务器使用状态代码304(未修改)进行响应,则不会使用新响应更新缓存。 这意味着它仍然认为缓存的响应已过期,并继续向服务器发出有条件的请求。我通过在必要时手动更新缓存来解决这个问题。 问题在于NSURLCache的工作透明,因此在NSURLConnectionLegate中,您无法直接验证响

当收到状态代码为
200
的响应时,NSURLCache会正确更新,并在
缓存策略中考虑
最大年龄

如果缓存已过期,如果自
起修改,则它也会使用
;如果不匹配,则使用
正确发送条件请求,如果之前检索到了相应的头。
如果现在服务器使用状态代码
304
未修改
)进行响应,则不会使用新响应更新缓存。

这意味着它仍然认为缓存的响应已过期,并继续向服务器发出有条件的请求。

我通过在必要时手动更新缓存来解决这个问题。 问题在于NSURLCache的工作透明,因此在NSURLConnectionLegate中,您无法直接验证响应是否来自缓存。
因此,我推断需要通过比较
数据
头和缓存的响应来更新响应:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    if (_response.statusCode == 200) {
        NSString *date = _response.allHeaderFields[@"Date"];
        NSCachedURLResponse *cached = [[NSURLCache sharedURLCache] cachedResponseForRequest:_connection.originalRequest];
        if (cached) {
            NSHTTPURLResponse *cachedResponse = (NSHTTPURLResponse *)cached.response;
            NSString *cachedDate = cachedResponse.allHeaderFields[@"Date"];
            if (![date isEqualToString:cachedDate]) {
                NSCachedURLResponse *updatedCache = [[NSCachedURLResponse alloc] initWithResponse:_response data:_data];
                [[NSURLCache sharedURLCache] storeCachedResponse:updatedCache forRequest:_connection.originalRequest];
            }
        }
    }
    ...
}

你有没有就这个问题向苹果公司提交过错误报告?在我的测试中,这个问题似乎已经在iOS 9中得到了修复。