Как отключить кэш AFNetworking - PullRequest
19 голосов
/ 02 апреля 2012

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

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

Спасибо,Ashley

Ответы [ 6 ]

25 голосов
/ 12 июня 2013

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

В проекте Apple URLCache есть следующее:

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

И затем делаем это, чтобы отключить кеш.

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

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

25 голосов
/ 02 апреля 2012

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

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

23 голосов
/ 19 декабря 2012

Я обнаружил на 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];
10 голосов
/ 09 февраля 2015

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

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

Вот оригинальный ответ

0 голосов
/ 15 августа 2017

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

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

0 голосов
/ 24 июля 2014
NSURLRequest *request = [NSURLRequest requestWithURL:URL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
...