2015-05-04 4 views
0

Я создаю приложение, в котором я хотел бы время от времени использовать кешированные ответы. Я столкнулся с какой-то странной проблемой, связанной с 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, но я получил то же поведение.

ответ

0

Хорошо, поэтому после некоторого дальнейшего расследования я пришел к выводу, что проблема находится где-то в NSURLSession. Я отправил те же запросы, что и выше, но использовал AFHTTPRequestOperation вместо AFHTTPSessionManager, и кеш отлично загружается на iOS 8+.

Не совсем уверен, где проблема, тем не менее, я думаю, что это имеет какое-то отношение к политике кэширования, но пока я придерживаюсь NSURLConnection.