Какой идеальный способ загрузить / очистить данные в UICollectionView из Bundle.main? - PullRequest
0 голосов
/ 10 марта 2019

У меня около 100 GIF в основном комплекте.Я загружаю все во время viewDidLoad () в массиве.Этот массив является источником данных для UICollectionView.Проблема в том, что эти GIF-файлы занимают много памяти, что приводит к замедлению и приводит к падению приложения из-за памяти.Когда я запускаю прокрутку, отладчик памяти показывает до 800 МБ +, а затем вылетает.

Crash

Я рассмотрел возможность интеграции сторонних библиотек для оптимизации производительности GIF-файлов.,Затем я подумал о создании своего рода решения для локального кэширования, где я мог бы разгрузить память и извлекать данные, когда это необходимо, в фоновом режиме, когда ячейка отключается.Это правильный подход или я слишком усложняю вещи?

Ответы [ 2 ]

2 голосов
/ 22 марта 2019
  1. Загрузить URL-адрес пакета gif (только URL, а не данные изображения) в viewDidLoad.
override func viewDidLoad() {
    gifUrls = ...
}
Использование стороннего представления в ячейке представления коллекции для отображения GIF.Например, мы используем BBWebImage .
// In collection view cell
imageView = BBAnimatedImageView(frame: frame)
При загрузке GIF асинхронно в collectionView(_:cellForItemAt:).
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellReuseID, for: indexPath)
    cell.tag = indexPath.item
    let url = gifUrls[indexPath.item]
    DispatchQueue.global().async {
        guard let data = try? Data(contentsOf: url) else { return }
        let gif = BBAnimatedImage(bb_data: data)
        DispatchQueue.main.async {
            guard cell.tag == indexPath.item else { return }
            cell.imageView.image = gif
        }
    }
}
1 голос
/ 10 марта 2019

Как сказал @rmaddy, вы можете загружать картинки в цикле видимых ячеек следующими способами:

func collectionView(_ collectionView: UICollectionView, 
             willDisplay cell: UICollectionViewCell, 
               forItemAt indexPath: IndexPath)

Подробнее

И

func collectionView(_ collectionView: UICollectionView, 
        didEndDisplaying cell: UICollectionViewCell, 
               forItemAt indexPath: IndexPath)\

Подробнее

Загрузите gif на willDisplay и разгрузите его на didEndDisplaying.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...