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

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 как-то кеширует старый ответ. Я не хочу такого поведения. Я хочу скачать текущий канал. Есть ли какие-то настройки или параметры, которые мне нужно установить, чтобы отключить кэширование?

4b9b3361

Ответ 1

Сделайте длинный рассказ коротким, просто определите своего менеджера AFNetworking:

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

Наслаждайтесь!

Ответ 2

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

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

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

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

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

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

NSURLRequestReloadIgnoringLocalCacheData

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

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

[request setCachePolicy: NSURLRequestReloadIgnoringLocalCacheData];

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

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

Ответ 3

Просто выполните:

manager.requestSerializer.cachePolicy = NSURLRequestCachePolicyReturnCacheDataElseLoad

Ответ 4

Для Swift poeple

let manager = AFHTTPSessionManager()
manager.requestSerializer.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData

Ответ 5

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

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

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

Ответ 6

Я не чувствую себя хорошо, но вот что работает. В AppDelegate didFinishLaunchingWithOptions:

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

Ответ 7

С AFNetworking 3:

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

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL
                                                         sessionConfiguration:sessionConfiguration];

Ответ 8

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

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