Къде да кеширам отдалечени файлове с изображения в 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 (дали това е предимство или не зависи от случая на употреба). Използването на директорията Library е препоръчителният от Apple начин за съхраняване на данни, които са архивирани, но не се появяват в инструмента за обмен на файлове на iTune (директория 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
Благодаря Damo.. Използвам тази библиотека. - person Krishnan; 12.05.2011

За решение за кеширане на изображения на платформа iOS може да помислите за рамка SDWebImage, достъпна на адрес: https://github.com/rs/SDWebImage. Той е много лесен за интегриране и се грижи за всичките ви грижи за кеширане на изображения.: прочетете повече за работата тук: https://github.com/rs/SDWebImage#readme

Наскоро избрахме това за нашето приложение и работи чудесно.

person user1242321    schedule 28.11.2012