NSURLCache не работает после завершения работы приложения iOS

Я создаю приложение, в котором также реализую автономный режим. Для этого я использовал механизм NSURLCache. Когда приложение находится на переднем плане, механизм кеширования работает отлично, даже если устройство переходит в автономный режим. Проблема возникает, когда я выхожу из приложения, а затем открываю его в автономном режиме. На этот раз NSCachedURLResponse возвращает ноль для конкретного запроса.

Ниже приведен код, который я использую для этого:

Создание собственного кеша:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:1024*1024 diskCapacity:1024*1024*5 diskPath:nil];
    [NSURLCache setSharedURLCache:urlCache];
}

Вызывающий сервер и кешированный объект:

-(void)serverCall
{
   NSURLCache *urlCache = [NSURLCache sharedURLCache];

   NSString *urlString = nil;
   NSHTTPURLResponse *response = nil;
   NSError *error = nil;

   urlString = [NSString stringWithFormat:@"%@%@",BASE_URL,url];
   urlString = [urlString stringByReplacingOccurrencesOfString:@" " withString:@"%20"];

   NSURL *finalUrl = [NSURL URLWithString:urlString];
   NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:finalUrl];
   request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;

   NSData *data = nil;

   if ([self checkInternetConnection])
   {
       data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

       NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:response data:data];
       [urlCache storeCachedResponse:cachedResponse forRequest:request];
   }
   else
   {
       NSCachedURLResponse *cachedResponse = [urlCache cachedResponseForRequest:request];
       response = cachedResponse.response;
       data = cachedResponse.data;
   }
}

Я вижу, что caches.db в пути к библиотеке приложения сохраняется ответ. Но когда я пытаюсь прочитать его в автономном режиме (после того, как приложение убито из фона), кешированный ответ становится нулевым. Я прошел по следующим ссылкам (и многим другим), но не смог найти решение своей проблемы.

Проблема NSURLCache с ответом кеша

Как использовать NSURLCache для возврата кешированные ответы API в автономном режиме (приложение для iOS)

http://twobitlabs.com/2012/01/ios-ipad-iphone-nsurlcache-uiwebview-memory-utilization/

http://petersteinberger.com/blog/2012/nsurlcache-uses-a-disk-cache-as-of-ios5/

Обход HTTP-заголовка ответа Cache-Control: как сделать установить срок действия кеша?

Я проверил поля заголовка http и кешированный заголовок в ответе api, и проблема не на стороне сервера.

Я также попытался указать путь в параметре diskPath при создании настраиваемого кеша, но тогда он даже не загружает кешированный объект, пока приложение находится на переднем плане, а Интернет отключается. Я также изменил срок годности, но работа осталась прежней.

Я пробовал использовать SDURLCache, но столкнулся с аналогичной проблемой. Однако я успешно добился этого с помощью ASIHTTPRequest, но я не хочу его использовать, поскольку я уже написал все операции с сервером один раз, и мне нужно изменить каждый запрос с помощью метода ASIHTTPRequest.

Пожалуйста, помогите мне найти решение для этого. Заранее спасибо....


person minti    schedule 02.09.2014    source источник
comment
Вы можете решить эту проблему? Я тоже задаю ту же проблему. Данные есть в cache.db, но они не загружаются, и если вы перезагрузите приложение несколько раз, оно иногда будет загружать данные. Это странно.   -  person Arsalan    schedule 21.09.2016
comment
@Arsalan Нет, я не смог найти решение. В то время для этого я использовал ASIHTTPRequest. Думал, что я все еще сталкиваюсь с той же проблемой при использовании NSURLCachePolicy.   -  person minti    schedule 22.09.2016