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