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中得到了修复。