То, что вы пытаетесь сделать, имеет имя, и это caching.
AFNetworking
уже реализует его согласно official FAQs
Does AFNetworking есть какие-либо механизмы кэширования встроенных?
AFNetworking
использует функциональность кэширования, уже предоставленную NSURLCache
и любым из ее подклассов. До тех пор, пока объекты NSURLRequest
имеют правильную политику кэширования, а ответ вашего сервера содержит допустимый заголовок Cache-Control, ответы будут автоматически кэшированы для последующих запросов.
Настройка кэша следующим образом, и вы будете в порядке
- (void)setupCache {
NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:1024*1024*4 // 1MB mem cache
diskCapacity:1024*1024*5 // 5MB disk cache
diskPath:nil];
[NSURLCache setSharedURLCache:urlCache];
}
Тогда просто выполнять запросы, как правило, и если ресурс находится в кэше, вы получите хит кэш и не будет загружая его дважды.
Обратите внимание, что если вы должны поддерживать что-нибудь ниже iOS5
, вы должны использовать альтернативный кэш URL как SDURLCache
и установить его как следует
- (void)setupCache {
SDURLCache *urlCache = [[SDURLCache alloc] initWithMemoryCapacity:1024*1024 // 1MB mem cache
diskCapacity:1024*1024*5 // 5MB disk cache
diskPath:[SDURLCache defaultCachePath]];
[NSURLCache setSharedURLCache:urlCache];
}
Причина хорошо объяснена в this article, но его можно суммировать по следующей цитате:
Перед тем, как iOS5, NSURLCache
только что сохранили запросы в память, даже если документация sai d в противном случае - свойство diskCapacity было тихо игнорировано
Я считаю, что AFNetworking кэширует результаты по URL-адресу. Вы можете проверить, действительно ли он снова вызывает услугу сети, используя что-то вроде Чарльза. http://www.charlesproxy.com Я использую его для отладки всех моих сетевых вызовов. – Fogmeister
@Fogmeister это правда, что 'AFNetworking' использует' NSURLCache'. Но файлы размером более 10% от общего размера кеша не будут обналичены 'NSURLCache'. – rckoenes
Файлы варьируются от 150 КБ до 250 КБ, слишком ли они для NSURLCache? @rckoenes – GangstaGraham