Показывает много картинок в коллекцию
В моем приложении я хочу показать GIF-файлы из Giphy. Получение и прочее не проблема, но я не знаю, как лучше всего отобразить, например, все трендовые гифки. У меня есть коллекция, которая должна отображать все картинки с этим кодом:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: GifChooserCell.cellIdentifier, for: indexPath) as! GifChooserCell
let data = try! Data(contentsOf: gif.giphyURL)
let image = FLAnimatedImage(animatedGIFData: data)
cell.image.animatedImage = image
return cell
}
Проблема в том, что это загружает все в оперативную память, а приложение работает очень медленно. Какой лучший способ сделать это? Асинхронный? Ленивая загрузка?
1 ответ
Я столкнулся с той же проблемой с AImage, который также загружает файлы APNG. Я обнаружил, что все эти платформы Gif и APNG используют отдельные CADisplayLinks для их запуска. В моем случае загрузка процессора составляла около 7% на ячейку и росла линейно с количеством ячеек.
Когда я отключил объекты CADisplayLinks, загрузка моего процессора составляла примерно 3% после загрузки.
Для решения я рассматриваю остановку всей анимации после запуска прокрутки или, возможно, использование одиночного файла для управления всеми моими файлами APNG.
Надеюсь это поможет.
ОБНОВИТЬ:
Я пошел дальше и преобразовал все свои файлы APNG в элементы MSSticker, сначала сохранив файлы APNG на диск, а затем создал массив наклеек.
При использовании стикеров загрузка моего процессора составляет 5%, а памяти - 60 МБ для 7 файлов APNG. Мой оригинальный метод использования AImageView для управления каждым APNG получает около 40% загрузки процессора.