2012-04-01 4 views
19

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

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

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

ответ

24

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

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

+3

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

+0

По умолчанию отключено. Вы должны сделать выбор, создав «NSURLCache» и установив это как общий кэш. – mattt

+4

Это уже? В настоящее время похоже, что он будет автоматически создан для вас. https://github.com/AFNetworking/AFNetworking/blob/experimental-1.0RC1/AFNetworking/UIImageView%2BAFNetworking.m#L70 – steipete

23

Я нашел на iOS 6, что запросы иногда кэшируются, даже если запрос имеет NSURLRequestReloadIgnoringCacheData. Добавление блока ответа кэш-памяти, который возвращает nil, предотвращает кеширование запроса.

+0

I второй это. Спасибо за решение! – Firefly

+4

Для использования 'AFHTTPClient' мы должны переопределить' requestWithMethod: путь: parameters' .Call super метод для получения 'NSURLRequest' и сказать' request.cachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData; ' – Yeung

+0

Не могли бы вы исправить неправильный тип перечисления в своем фрагмент кода? Это будет мисс, ведущий для тех, кто не замечает, что есть два обновления. –

25

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

Проект Urlcache Apple, это сказать:

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

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

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

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

+1

работал для меня даже с AFnetworking - кэши искажали возобновленную загрузку с https-сервиса ... – PetrV

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

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

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

Here's the original answer

+0

У меня есть singleton для управления вызовами Backend. Я помещаю эти две строки кода в мой метод init, и все работает хорошо! – Zeb

0

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

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

Смежные вопросы