rai*_*els 9 caching nsurlcache ios swift ios8
NSURLCache今天我在Charles Proxy中检查请求和响应头时发现了(可能)的问题.这个问题有点令人困惑,但我能够一贯地重复它:
简而言之,该问题与NSURLRequest使用NSURLCache默认策略的iOS本机缓存s 有关.事实证明,只要响应有标头,就不会缓存请求transfer-encoding: chunked.但是如果响应头是content-length: xxx相反的,缓存工作正常.具体来说,似乎当响应被分块时,NSURLCache不会保存eTag并且忽略将if-none-match标头附加到对同一URL的后续请求,因此,缓存失败(应该如此),即返回200而不是一个304.
我在iOS8.2模拟器上测试.即使你没有解决方案,我也很乐意听到你是否遇到过同样的问题.我找到了至少一个类似的报告),这是我的后端工程师发布的相关主题.
如果您手动将响应数据添加到缓存中,它应该可以工作。我有一个图像加载类,我想确保所有内容都被缓存,所以我做了这样的事情:
- (void)getImageWithURL:(NSURL *)url onCompletion:(void (^)(UIImage *image, NSError *error))completion {
NSURLRequest *request = [NSURLRequest requestWithURL:url];
UIImage *cachedImage = [self cachedImageForURLRequest:request];
if (cachedImage) {
NSLog(@"Got image from cache.");
completion(cachedImage, nil);
return;
}
[[[NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
// Manually cache the response.
NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:response data:data userInfo:nil storagePolicy:NSURLCacheStorageAllowed];
[[NSURLCache sharedURLCache] storeCachedResponse:cachedResponse forRequest:request];
NSLog(@"Got a fresh image.");
completion([UIImage imageWithData:data], error);
}] resume];
}
- (UIImage *)cachedImageForURLRequest:(NSURLRequest *)urlRequest {
NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:urlRequest];
return [UIImage imageWithData:cachedResponse.data];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
506 次 |
| 最近记录: |