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

Как отключить кеш AFNetworking

Можно ли отключить все функции кеша из AFNetworking?

Я создаю свою собственную систему кэширования и не хочу, чтобы это занимало место на диске.

Спасибо, Эшли

4b9b3361

Ответ 1

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

Тем не менее, если у вас нет особых причин писать собственную систему кэширования, я бы рекомендовал strong. NSURLCache достаточно хорош для 99,9% приложений: он обрабатывает директивы кеша из входящих ответов и соответствующим образом использует их с новыми запросами и делает это автоматически таким образом, что вряд ли будет узким местом производительности в вашем приложении. Как человек, который потратил впустую неисчислимые часы, сделав сам (и позже выбросив его, поскольку это было совершенно необязательно), я бы сказал, что есть намного лучшие места, чтобы сосредоточить ваше внимание на развитии.

Ответ 2

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

Apple URLCache Project имеет это, чтобы сказать:

По умолчанию система загрузки URL-адресов Cocoa использует небольшую разделяемую память кэш. Нам не нужен этот кеш, поэтому мы устанавливаем его на ноль, когда запуска приложений.

И затем это отключает кеш.

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0
                                                        diskCapacity:0
                                                            diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];

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

Ответ 3

Я нашел на 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];

Ответ 4

К сожалению, не все эти методы работали для меня. Единственный способ, которым мне удалось отключить кеш, - это:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

Здесь оригинальный ответ

Ответ 5

NSURLRequest *request = [NSURLRequest requestWithURL:URL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];

Ответ 6

Это может зависеть от вашей реализации сервера, но добавление заголовка Cache-Control:no-store к вашему исходящему запросу должно привести к отклику, содержащему тот же заголовок, поэтому команда NSURLCache не кэширует ответ на диск.

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