2017-01-16 1 views
1

Итак, у меня есть эта структура ленты новостей. Каждый новостной блок является обычным UITableViewCell. Теперь каждая пользовательская ячейка имеет CollectionView, которая показывает изображения.Как кэшировать изображения CollectionViewCell, которые являются частью пользовательского UITableViewCell

enter image description here

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

Какой был бы лучший подход?

ответ

0

Вы должны кэшировать экземпляр UIImage, поэтому, если вы получаете некоторые изображения из любого источника, вы могли бы написать что-то вроде ниже:

/* some code before */ 
UIImage *yourImage = /* Get your UIImage from any available way */ 
[self.cache setObject:yourImage forKey:@"SomeUniqueID"]; 
/* some code after */ 

Я думаю, этот код будет выглядеть больше как функция, которая получает экземпляр UIImage и его id как параметры.

Для моего мнения, это самый распространенный способ хранения изображений. Если вам нужен более опытный способ без каких-либо накладных расходов с сторонними фреймворками, вы можете прочитать документацию о NSCache.

Но в целом, у вас есть много различных способов, как сохранить ваши изображения:

  1. Получить изображение с диска
  2. Получить изображение из памяти
  3. Используйте один из вариантов выше, но в дополнение к ним все еще используются некоторые легкие гибкие рамки, вы можете найти много на GitHub.

Итак, код, который я написал выше, просто сохранит изображения в кеш памяти.

+0

Спасибо за ответ. У меня появилась идея. Удивление, память NSCache работает через UIViewControllers (что-то вроде NSUserDefault ..)? – ekashking

+0

Синтаксис @ekashkin NSCache аналогичен NSUserDefaults, и все объекты, которые должны хранить в кеше, должны реализовать протокол NSSecureCoding, например UIImage – Hamsternik

1

Если вы хотите избежать реализации собственных обработчиков кэша/диска/памяти для такого рода работ, я настоятельно рекомендую использовать AFNetworking или SDWebImage, которые обрабатывают все это для вас.

Пример SDWebImage о том, как установить изображение и его кэш:

[imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] 
      placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 

Это обрабатывает весь кэш/диск/память для вас автоматически.

Вот пример того, как вы справляетесь с кэшем SDWebImage:

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

[[SDImageCache sharedImageCache] setMaxMemoryCost:****]; 

// Очистка диска кэша

[[SDImageCache sharedImageCache] clearDiskOnCompletion:^{ 
}]; 

// Очистить кэш-память

[[SDImageCache sharedImageCache] clearMemory]; 

Я хотел бы держаться подальше от NSUserDefaults или упомянутых выше пример настройки изображения в словарь или массивы чтобы избежать ошибок памяти и сбоев/производительности приложений.

 Смежные вопросы

  • Нет связанных вопросов^_^