NSURLCache не работает (с Cache-Control = no-cache)

Я установил NSURLCache в своем AppDelegate:

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

Затем я пытаюсь использовать его с cachePolicy: NSURLRequestReturnCacheDataElseLoad

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:getUrl
                                                       cachePolicy:NSURLRequestReturnCacheDataElseLoad
                                                   timeoutInterval:timeInterval];
NSURLConnection *theConnection = [NSURLConnection connectionWithRequest:request delegate:self];

Но он вообще не работает (каждый раз запрашивает сервер и даже не пытается использовать кеш).

Я проверил заголовки в ответе сервера, вот он:

"Cache-Control" = "no-cache, no-store, max-age=0, must-revalidate";
"Content-Encoding" = gzip;
"Content-Type" = "application/json; charset=utf-8";
Date = "Sun, 29 Dec 2013 15:13:12 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
P3P = "CP=\"NOI DSP COR NID ADMa OPTa OUR NOR\"";
Pragma = "no-cache";
Server = QRATOR;

Из документации Apple:
Политика кеширования NSURLRequestReturnCacheDataElseLoad заставляет систему загрузки URL использовать кэшированные данные, игнорируя их возраст или дату истечения срока, и загружать данные из исходного источника, только если нет кэшированной версии.

Мои вопросы:

  1. Должен ли он работать (под работой я имею в виду кэширование ответа сервера) с "Cache-Control" = "no-cache, no-store, max-age = 0, must-revalidate" в заголовке ответа?

  2. Если нет, то какое решение я должен использовать для кеширования ответов сервера? (Я не могу вносить изменения на стороне сервера)


person n0_quarter    schedule 29.12.2013    source источник
comment
По умолчанию данные для подключения кэшируются в соответствии с политикой кеширования запроса в документах.   -  person iMom0    schedule 29.12.2013
comment
Да, по умолчанию. Но я не использую NSURLRequestUseProtocolCachePolicy по умолчанию, я использую NSURLRequestReturnCacheDataElseLoad, которые подразумевают использование кешированных данных, игнорируя их возраст или срок годности.   -  person n0_quarter    schedule 29.12.2013


Ответы (2)


Это довольно четко прописано в заголовке Cache-Control:

"Cache-Control" = "no-cache, no-store, max-age=0, must-revalidate";

Это говорит клиенту НЕ кэшировать ответ недвусмысленно ...

person HackyStack    schedule 24.01.2014
comment
Это означает, что я не могу использовать NSURLCache с таким заголовком http? А как насчет моего второго вопроса - какое решение для кеширования мне лучше использовать? - person n0_quarter; 29.01.2014

Вы можете вручную записать объект в кеш:

NSURLCache *sharedCache = [NSURLCache sharedURLCache];
[sharedCache storeCachedResponse:cachedResponse forRequest:request];

Сначала вам нужно подготовить cachedResponse, где вы можете изменять заголовки самостоятельно.

person icywire    schedule 19.02.2015