Кеширование на AFNetworking 2.0
Итак, вот сделка. Недавно я начал использовать AFNetworking для загрузки нескольких файлов при запуске, используя следующий код:
NSMutableURLRequest* rq = [api requestWithMethod:@"GET" path:@"YOUR/URL/TO/FILE" parameters:nil];
AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:rq] autorelease];
NSString* path=[@"/PATH/TO/APP" stringByAppendingPathComponent: imageNameToDisk];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"SUCCCESSFULL IMG RETRIEVE to %@!",path)
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// Deal with failure
}];
Мой путь фактически подключен к переменной пути (извините, сейчас не на нужном компьютере, чтобы на самом деле скопировать текст пасты, но он точно такой же, как и выше, с разными путями)
И все работает отлично! Я получаю файл успешно загружен и все. Моя текущая проблема заключается в том, что я пытаюсь заставить кэширование работать, но у меня много трудностей. По сути, я не уверен, что мне действительно нужно делать на стороне клиента с AFNetworking 2.0. Мне все еще нужно настроить NSURlCache? Нужно ли устанавливать заголовок типа кэширования для операции запроса по-другому? Я подумал, что, возможно, он просто полностью встроен, но я получаю статус 200 каждый раз, когда выполняется код, даже без изменений в файле. Если мне действительно нужно использовать NSUrlCache, нужно ли мне вручную сохранять электронный тег на успешных блоках, запрашивая операцию, и затем возвращать это обратно? Любая помощь о том, как прогрессировать, будет высоко ценится. Спасибо, парни!
1 ответ
AFNetworking по умолчанию использует NSURLCache для кэширования. Из FAQ:
AFNetworking использует возможности кеширования, уже предоставленные
NSURLCache
и любой из его подклассов. Пока вашNSURLRequest
объекты имеют правильную политику кэширования, а ваш ответ сервера содержит действительныйCache-Control
заголовок, ответы будут автоматически кэшироваться для последующих запросов.
Обратите внимание, что этот механизм кэширует NSData
поэтому каждый раз, когда вы извлекаете данные из этого кэша, вам нужно выполнять NSData
-До- UIImage
операция. Этого недостаточно для быстрого отображения, например, если вы показываете UITableView
или же UICollectionView
,
Если это так, посмотрите на UIImageView+AFNetworking
, который добавляет загрузки и кеширование UIImage
возражает против UIImageView
, Для некоторых приложений вы можете просто использовать готовую реализацию, но она очень проста. Возможно, вы захотите взглянуть на исходный код этого класса (он не очень длинный) и использовать его в качестве отправной точки для вашего собственного механизма кэширования.