Где кэшировать удаленные файлы изображений в iOS?

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

У меня есть два варианта:

  1. Либо кэшировать изображения в виде файла и использовать его при необходимости.
  2. Кэшируйте объекты изображений в памяти и используйте их, когда это необходимо, и записывайте их в файлы при выходе из приложения.

Какой из них будет лучше?

Пожалуйста, дайте мне знать, если у вас есть какие-либо предложения относительно кэширования изображений.


person Krishnan    schedule 12.05.2011    source источник


Ответы (5)


Ваш второй подход имеет 2 основных недостатка:

  1. Если изображений слишком много, ваше приложение получит предупреждение о нехватке памяти, и вам все равно придется удалять изображения из памяти.
  2. Также не рекомендуется сохранять все изображения в файл при выходе из приложения - нет гарантии, что ваш код сохранения завершится при выходе из приложения (например, если это займет слишком много времени, система может просто завершить работу вашего приложения, и ваши изображения будут потеряны)

Я бы предложил сохранять изображения в файлы сразу после их загрузки и хранить в памяти разумное количество изображений, которые вам нужно показать без видимой задержки (загрузка дополнительных изображений по мере необходимости и удаление ненужных).

person Vladimir    schedule 12.05.2011

Я бы порекомендовал вам первый вариант. Оставляет вам больше гибкости, например. когда размер данных увеличивает объем памяти.

person bertolami    schedule 12.05.2011

Я бы сделал это так: есть NSMutableDictionary с кэшированными изображениями (как объекты UIImage). Если изображения нет в кеше, посмотрите, доступно ли оно в виде файла. Если он недоступен в виде файла, загрузите его, поместите в свой словарь и также запишите в файл.

Что касается куда записывать файлы: вы можете использовать NSTemporaryDirectory() или создайте каталог внутри вашего NSLibraryDirectory (используйте NSSearchPathForDirectoriesInDomains, чтобы найти его). Последний имеет то преимущество/недостаток, что он будет в резервной копии iTunes (будь то преимущество или нет, зависит от варианта использования). Apple рекомендует использовать каталог Library для хранения резервных копий данных, которые не отображаются в файловом обмене iTunes (каталог Documents).

person DarkDust    schedule 12.05.2011
comment
Спасибо Darkdust за логику. - person Krishnan; 12.05.2011

Я начал использовать EGOImageView для кэширования; он очень универсален и справляется со всеми сложностями кэширования за вас.

Он очень хорошо работает для загрузки изображений через http, вы можете найти его на веб-сайте разработчика EGO здесь.

http://developers.enormego.com/

person Damo    schedule 12.05.2011
comment
кажется хорошим вариантом ... Вы получаете предупреждения о памяти при использовании этого? - person Krishnan; 12.05.2011
comment
нет, совсем нет - ну, не больше, чем обычно ;-) Ниже приведен фрагмент кода ~~~~ imageView = [[EGOImageView alloc] initWithPlaceholderImage:[UIImage imageNamed:@Placeholder.jpg]]; imageView.frame = CGRectMake(4.0f, 4.0f, 36.0f, 36.0f); [self.contentView addSubview:imageView]; imageView.imageURL = [NSURL URLWithString: @some.real.url/withanimage.png] ; - person Damo; 12.05.2011
comment
Спасибо, Дамо. Я использую эту библиотеку. - person Krishnan; 12.05.2011

Для решения для кэширования изображений на платформе iOS вы можете рассмотреть инфраструктуру SDWebImage, доступную по адресу: https://github.com/rs/SDWebImage. Его очень легко интегрировать, и он берет на себя все ваши заботы о кэшировании изображений. Подробнее о работе читайте здесь: https://github.com/rs/SDWebImage#readme

Недавно мы выбрали это для нашего приложения, и оно отлично работает.

person user1242321    schedule 28.11.2012