Подтвердить что ты не робот

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

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

Я бы хотел использовать NSURLCache для возврата кэшированных ответов на вызовы API, которые я делаю в приложении iOS. Когда устройство подключено к сети, я хотел бы вернуть кешированный ответ, если он достаточно недавний, в противном случае извлечение из удаленного. Когда устройство отключено, я хотел бы немедленно вернуть кешированный ответ (если он есть) независимо от его возраста.

Я использую AFNetworking. API-вызовы, которые я делаю, относятся к серверу, которым я управляю. Протокол HTTPS. Заголовок ответа Cache-Control в настоящее время "max-age=0, public". В настоящее время я не устанавливаю заголовки заголовков, связанных с кешем (должен ли я?). Я установил политику кэша запросов как NSURLRequestReturnCacheDataDontLoad в автономном режиме и использую по умолчанию NSURLRequestUseProtocolCachePolicy в режиме онлайн. И я вижу запросы и их ответы по умолчанию Cache.db на диске. Однако, когда я в автономном режиме, все запросы не выполняются (кэшированные ответы (несмотря на то, что они были кэшированы) используются/возвращаются.

Per http://nshipster.com/nsurlcache/ Я инициализирую sharedURLCache в didFinishLaunchingWithOptions и поставлю блок AFNetworking setCacheResponse примерно так:

NSMutableDictionary *mutableUserInfo = [[cachedResponse userInfo] mutableCopy]; 
NSMutableData *mutableData = [[cachedResponse data] mutableCopy]; 
NSURLCacheStoragePolicy storagePolicy = NSURLCacheStorageAllowed;
return [[NSCachedURLResponse alloc] initWithResponse:[cachedResponse response] data:mutableData userInfo:mutableUserInfo storagePolicy:storagePolicy];

Я прочитал эти и другие сообщения по теме:

http://petersteinberger.com/blog/2012/nsurlcache-uses-a-disk-cache-as-of-ios5/ http://blackpixel.com/blog/2012/05/caching-and-nsurlconnection.html

Мне интересно, удалось ли кому-нибудь из них достичь этой функциональности до использования стандартного NSURLCache (также заинтересованного в истории успеха с участием SDURLCache, но Питер С. говорит, что с кешированием iOS5 поддерживается, поэтому SDURLCache больше не требуется, т.е. я хотел бы использовать встроенный кеш по умолчанию).

Спасибо заранее!

4b9b3361

Ответ 1

Вы видели этот пост?

Автономный режим AFNetworking (AFHttpClient) не работает с политикой NSURLRequestReturnCacheDataDontLoad

Похоже, это может быть ошибка с iOS 6. Вот что Роберт Мао должен был сказать в сообщении:

В обобщенной работе читается ответ от кеша, а не используйте политику NSURLRequestReturnCacheDataDontLoad:

NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache]     cachedResponseForRequest:request];
if (cachedResponse != nil &&
    [[cachedResponse data] length] > 0)
{
    // Get cached data
    ....
}

Ответ 2

Если все ваши вызовы не являются 100% GET и не имеют побочных эффектов или зависят от времени, это опасно.