我正在创建一个应用程序,在那里我希望不时使用缓存的响应。我遇到了一个与NSURLCache有关的奇怪问题,更糟糕的是,如果我根据请求设置NSURLRequestReturnCacheDataDontLoad,就不会在iOS 8上得到缓存的响应。下面是我与AFNetworking一起使用的代码:
// Define web request.
void (^simpleBlock)(void) = ^{
GTSessionManager.manager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
[GTSessionManager.manager POST:string parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
NSDictionary *responseJson = responseObject;
[self parseJsonSuccess:responseJson];
} failure:^(NSURLSessionDataTask *task, NSError *error) {
if (error.userInfo[JSONResponseSerializerWithDataKey]) {
NSData *data = error.userInfo[JSONResponseSerializerWithDataKey];
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&error];
[self parseJsonError:json];
}
else
[self parseJsonError:nil];
}];
};
if (self.shouldUseCache) {
GTSessionManager.manager.requestSerializer.cachePolicy = NSURLRequestReturnCacheDataDontLoad;
[GTSessionManager.manager POST:string parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
NSDictionary *responseJson = responseObject;
[self parseJsonCacheSuccess:responseJson];
// Load second request.
simpleBlock();
} failure:^(NSURLSessionDataTask *task, NSError *error) {
simpleBlock();
}];
}
else
simpleBlock();这里的主要思想是,如果客户机想要使用缓存,第一个请求应该尝试加载它,将结果传递给处理程序,并开始重新加载请求以刷新缓存。
这种方法在iOS 7上工作得很好,但在iOS 8+上却不起作用。我已经用下面的调用设置了NSURLCache。
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:500 * 1024 * 1024
diskCapacity:500 * 1024 * 1024
diskPath:@"cache" /**Tried nil here as well. */];
[NSURLCache setSharedURLCache:sharedCache];我读了几篇文章和其他一些关于这方面的问题,但我就是不能让它起作用。我是不是遗漏了什么?这可能与我使用的职位申请有关吗?
编辑忘记提到我没有在服务器上使用缓存策略。我还尝试使用Cache-Control=max-age=604800, public设置缓存策略,但行为相同。
发布于 2015-05-06 09:55:00
好的,经过进一步的调查,我得出结论,问题就在NSURLSession的某个地方。我发送了与上面完全相同的请求,但是使用了AFHTTPRequestOperation而不是AFHTTPSessionManager,并且缓存在iOS 8+上加载得很好。
不过,我不太确定问题在哪里,我认为这与缓存策略有关,但目前我还是坚持使用NSURLConnection。
https://stackoverflow.com/questions/30033262
复制相似问题