AFNetworking — не кэшировать ответ

Я использую этот код для получения простого канала JSON с сервера:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];

[manager GET:kDataUrl parameters:nil
 success:^(AFHTTPRequestOperation *operation, id responseObject) {
     NSLog(@"response: %@", responseObject);
 }
 failure:^(AFHTTPRequestOperation *operation, NSError *error) {
     NSLog(@"JSON DataError: %@", error);
 }];

Оно работает. Однако после того, как я изменил файл JSON в kDataUrl и убедился, что изменение сделано в браузере, при повторном запуске приложения я все еще получаю предыдущий ответ.

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


person soleil    schedule 23.11.2013    source источник
comment
ты решил это? Я не могу найти что-то, чтобы установить политику кэширования в AFHTTPRequestOperationManager   -  person laucel    schedule 10.01.2014
comment
Я расскажу о кэшировании в AFNetworking в этой записи блога — AFImageCache и NSURLCache. Возможно, вы обнаружите, что он использует грипп: blog.originate.com /blog/2014/02/20/afimagecache-vs-nsurlcache   -  person vfxdrummer    schedule 14.03.2014
comment
попробуйте так: stackoverflow.com/questions/33767908/   -  person Vvk    schedule 19.02.2016


Ответы (8)


Короче говоря, просто определите своего менеджера AFNetworking:

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

Наслаждаться!

person gran33    schedule 12.05.2014
comment
Для AFNetworking такого метода с именем setCachePolicy не существует. Не могли бы вы сделать это более ясным? - person Aswin Sathyan; 09.07.2015
comment
В новых версиях библиотеки AFNetworking вы можете установить это как объект конфигурации сеанса URL. NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; configuration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; - person dishan; 29.02.2016

То, что вы испытываете, — это эффект кеша URL (см. NSURLCache).

Поведение кэширования запроса можно определить, установив «Политику кэширования» для объекта NSMutableURLRequest, например:

NSMutableURLRequest* request = ...;
[request setCachePolicy: myCachePolicy];

Поведение кэширования по умолчанию (NSURLRequestUseProtocolCachePolicy) соответствует текущему протоколу HTTP. А для протокола HTTP GET-запросы будут кэшироваться по умолчанию!

И AFNetworking не меняет поведение запроса по умолчанию!

Теперь вы можете установить другую политику кэширования, например:

NSURLRequestReloadIgnoringLocalCacheData

Указывает, что данные для загрузки URL должны быть загружены из исходного источника. Никакие существующие данные кеша не должны использоваться для удовлетворения запроса на загрузку URL.

Вероятно, это желаемое поведение, которого вы хотите достичь:

[request setCachePolicy: NSURLRequestReloadIgnoringLocalCacheData];

Проблема здесь в том, что супер «удобный» API не дает возможности настроить поведение кэша URL для запроса. Вы вообще не можете получить доступ к используемому запросу.

Таким образом, я бы предложил использовать API более низкого уровня, где у вас есть контроль над созданным объектом NSMutableURLRequest, и соответствующим образом установить политику кэширования.

person CouchDeveloper    schedule 23.11.2013

Просто делать:

manager.requestSerializer.cachePolicy = NSURLRequestCachePolicyReturnCacheDataElseLoad
person Pranshu    schedule 19.02.2016

Для быстрых людей

let manager = AFHTTPSessionManager()
manager.requestSerializer.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData
person AITAALI_ABDERRAHMANE    schedule 27.02.2016

С AFNetworking 3:

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL
                                                         sessionConfiguration:sessionConfiguration];
person Dirty Henry    schedule 22.06.2016

попробуйте добавить какой-нибудь мусор в конце вашего URL (например, метку времени)

kDataUrl = [NSString stringWithFormat:@"%@?%f", kDataUrl, [NSDate timeIntervalSinceReferenceDate]];

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

person dollar2048    schedule 02.02.2017

Я не чувствую себя хорошо об этом, но вот что работает. В AppDelegate сделалFinishLaunchingWithOptions:

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0
                                                            diskCapacity:0
                                                                diskPath:nil];
    [NSURLCache setSharedURLCache:sharedCache];
person soleil    schedule 23.11.2013

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"];
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

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

person Yuri Brigance    schedule 14.08.2017