2013-08-27 5 views
0

Я пытаюсь загрузить некоторые файлы.Как кэшировать загрузку файлов с помощью AFNetworking?

Для каждой ячейки я проверяю, существует ли файл и уже сохранен в каталоге, если я его не загружаю.

Но я также скачиваю файлы для следующих двух ячеек.

Что происходит, если я пытаюсь загрузить файл для невидимой ячейки раньше времени, но затем пользователь прокручивает ячейку, и файл еще не загружен полностью.

Есть ли все-таки предотвратить его одновременную загрузку? Есть ли все равно знать, что файл уже загружается?

Я использую AFNetworking.

+0

Я считаю, что AFNetworking кэширует результаты по URL-адресу. Вы можете проверить, действительно ли он снова вызывает услугу сети, используя что-то вроде Чарльза. http://www.charlesproxy.com Я использую его для отладки всех моих сетевых вызовов. – Fogmeister

+1

@Fogmeister это правда, что 'AFNetworking' использует' NSURLCache'. Но файлы размером более 10% от общего размера кеша не будут обналичены 'NSURLCache'. – rckoenes

+0

Файлы варьируются от 150 КБ до 250 КБ, слишком ли они для NSURLCache? @rckoenes – GangstaGraham

ответ

4

То, что вы пытаетесь сделать, имеет имя, и это 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 было тихо игнорировано

+0

Вы также можете использовать ['NSURLCache'] (https://developer.apple.com/library/iOS/documentation/Cocoa/Reference/Foundation/Classes/NSURLCache_Class/Reference/Reference.html) таким же образом, нет необходимости в внешней библиотеке. Так как iOS 5 'NSURLCache' будет обрабатывать заголовки кэшей правильно. Просто имейте в виду, что файлы lager, тогда 10% от общего размера кеша не будут кэшироваться. 'NSURLCache * URLCache = [[NSURLCache alloc] initWithMemoryCapacity: 4 * 1024 * 1024 diskCapacity: 20 * 1024 * 1024 diskPath: nil];' Then просто установите общий кэш: '[NSURLCache setSharedURLCache: URLCache];' – rckoenes

+0

@rckoenes вы правы насчет 'NSURLCache', есть ли у вас какая-либо ссылка на 10% общего размера кеша? –

+0

Так что я просто вызываю 'setupCache' из' viewDidLoad', (если нет, откуда я должен позвонить этому методу), и тогда AFNetworking узнает его и не будет пытаться загрузить его дважды? – GangstaGraham