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