NSURLCache忽略304(未修改)响应的“max-age”

时间:2014-05-23 10:24:51

标签: ios macos

收到状态代码为200的回复后,NSURLCache会更新,并会在max-age中考虑Cache-Policy
如果缓存已过期,如果之前检索到相应的标头,它还会使用If-Modified-SinceIf-None-Match正确发送条件请求。
如果现在服务器以状态代码304Not Modified)响应,则它不会使用新响应更新缓存。
这意味着它仍然认为缓存的响应已过期,并继续向服务器发出条件请求。

1 个答案:

答案 0 :(得分:2)

我通过在必要时手动更新缓存来解决此问题。 问题是NSURLCache透明地工作,因此在NSURLConnectionDelegate中,您无法直接验证响应是否来自缓存。
因此,我推断需要通过将Data标头与缓存响应进行比较来更新响应:

- (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];
            }
        }
    }
    ...
}