Можно ли отключить все функции кеша из AFNetworking?
Я создаю свою собственную систему кэширования и не хочу, чтобы это занимало место на диске.
Спасибо, Эшли
Можно ли отключить все функции кеша из AFNetworking?
Я создаю свою собственную систему кэширования и не хочу, чтобы это занимало место на диске.
Спасибо, Эшли
Кэширование обрабатывается по всей программе с помощью NSURLCache
. Если вы не устанавливаете общий кэш, запросы не кэшируются. Даже с общим NSURLCache
реализация по умолчанию в iOS не поддерживает кэширование диска.
Тем не менее, если у вас нет особых причин писать собственную систему кэширования, я бы рекомендовал strong. NSURLCache
достаточно хорош для 99,9% приложений: он обрабатывает директивы кеша из входящих ответов и соответствующим образом использует их с новыми запросами и делает это автоматически таким образом, что вряд ли будет узким местом производительности в вашем приложении. Как человек, который потратил впустую неисчислимые часы, сделав сам (и позже выбросив его, поскольку это было совершенно необязательно), я бы сказал, что есть намного лучшие места, чтобы сосредоточить ваше внимание на развитии.
Сначала я нашел ответ Джейсона Мура на работу, однако недавно я заметил, что мое приложение все еще кэширует запросы. Я не использую последнее AFNetworking, поэтому я не знаю, было ли кэширование рассмотрено в более поздних сборках.
Apple URLCache Project имеет это, чтобы сказать:
По умолчанию система загрузки URL-адресов Cocoa использует небольшую разделяемую память кэш. Нам не нужен этот кеш, поэтому мы устанавливаем его на ноль, когда запуска приложений.
И затем это отключает кеш.
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0
diskCapacity:0
diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];
Это отключит все кэширование для всего вашего приложения, что может быть не идеальным в некоторых ситуациях, но поскольку NSURLRequest
не соблюдает запрашиваемую политику кэша, это единственный вариант, который я могу видеть.
Я нашел на iOS 6, что запросы иногда кэшируются, даже если запрос имеет NSURLRequestReloadIgnoringCacheData
. Добавление блока ответа кэша, который возвращает nil
, предотвращает кеширование запроса.
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:20];
AFJSONRequestOperation *op =
[AFJSONRequestOperation JSONRequestOperationWithRequest:request];
// DISABLE CACHE //
[op setCacheResponseBlock:^NSCachedURLResponse *(NSURLConnection *connection, NSCachedURLResponse *cachedResponse) {
return nil;
}];
[op start];
К сожалению, не все эти методы работали для меня. Единственный способ, которым мне удалось отключить кеш, - это:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
NSURLRequest *request = [NSURLRequest requestWithURL:URL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
Это может зависеть от вашей реализации сервера, но добавление заголовка Cache-Control:no-store
к вашему исходящему запросу должно привести к отклику, содержащему тот же заголовок, поэтому команда NSURLCache
не кэширует ответ на диск.
IMHO - это лучший подход, чем полностью отключить кэширование дисков, особенно если вы пишете SDK-код, который будет использоваться другими приложениями, которые могут использовать NSURLCache
.