Я создаю приложение, в котором я хотел бы время от времени использовать кешированные ответы. Я столкнулся с какой-то странной проблемой, связанной с NSURLCache, более скептически, если я установил NSURLRequestReturnCacheDataDontLoad по моему запросу, я не получаю кешированный ответ на iOS 8. Вот код, который я использую с AFNetworking, чтобы получить эту работу:iOS 8 NSURLCache issue
// 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];
Я прочитал несколько статей и другие вопросы, связанные с этим, но я просто не могу заставить это работать. Я что-то упускаю? Может быть, это связано с тем, что я использую запрос POST?
EDIT Забыл упомянуть, что я не использую политику кэширования на своем сервере. Я также попытался установить политику кэширования с помощью Cache-Control=max-age=604800, public
, но я получил то же поведение.