CollectionView с большим количеством данных Swift - PullRequest
0 голосов
/ 05 октября 2018

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

Структура ячейки:

  • Одно изображение
  • И 2 строки текста в каждой ячейке

По сути, мой макет коллекции похож на 3 ячейки в одной строке (несколько строк) с закругленными углами и тенями.Проблема, с которой я сталкиваюсь, заключается в том, что при получении более 30 продуктов, полученных от сервера, использование памяти увеличивается до 200 МБ, а на старых устройствах (iOS 10. *) экран с задержкой просмотра коллекции.

Способ, которым яПолучаю данные:

  • В Interactor Я запрашиваю все текстовые данные продуктов вместе со ссылками на файлы изображений,
  • В моем представлении коллекции cellForItemAt Iотобразить эти данные и там я начинаю загружать изображения с помощью этой библиотеки - Kingfisher

    if url != nil {
        productsCell.productImage.kf.indicatorType = .activity
        productsCell.productImage.kf.setImage(with: url)
    } else {
        productsCell.productImage.image = clipImage
    }
    
  • Размер получаемых изображений варьируется от 4-6 Мб.

Я использую VIPER в качестве архитектуры моего приложения и проверил на утечки памяти, но все вроде бы хорошо.Когда я запускаю приложение на других экранах, мое использование памяти составляет около - 30 МБ.Поэтому главная проблема, с которой я сталкиваюсь, - это загрузка данных изображения.Я дал Googled и прочитал много статей об оптимизации, но они дают в основном общие советы и не отражают такой случай, как у меня здесь.Они предлагают:

  • Использование принципов управления памятью - выполнено
  • Разбиение на страницы - нет

Во время тестирования я обнаружил, что если я заполнил представление коллекциисо статичным изображением клипа - использование памяти уменьшается до ± 100 МБ

Я хотел бы спросить:

  • Есть ли какие-либо готовые решения для представлений коллекции, которые уже оптимизированы для обработкимного данных изображения?Я искал github, но большинство фреймворков коллекций связано с макетами Cutom.
  • Как уменьшить использование памяти при работе с большим количеством данных?
  • Может ли размер изображения вызывать такую ​​нагрузку на память?
  • Могу ли я избежать использования нумерации страниц, так как представление коллекции повторно использует ячейки?

Заранее спасибо за помощь и хороших выходных!

Ответы [ 2 ]

0 голосов
/ 05 октября 2018
  • Kingfisher уже содержит все необходимые функции
  • Вы можете использовать несколько уровней кеша, например, если вы достигли пределов использования памяти, он будет кешировать данные на диске
  • Да, если вы сохраняете в памяти много изображений
  • Вы можете отключить загрузку изображения, если ячейка перестала отображаться на экране.

Я думаю, что вам нужно реализовать UITableViewDelegate func tableView: didEndDisplayingCell: forRowAtIndexPath

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    cell.imageView.kf.cancelDownloadTask()
}

Kingfisher позволяет настраивать параметры кэша изображений ( ImageCache ), например:

maxCachePeriodInSecond, maxMemoryCost,maxDiskCacheSize

Поэтому вы можете настроить maxMemoryCost так, чтобы объем памяти не превышал 50 МБ.

Кроме того, Kingfisher автоматически очищает кэш памяти при получении уведомления о предупреждении памяти.

0 голосов
/ 05 октября 2018

Скорее всего, ваша проблема в том, что размер изображения большой, попробуйте сжать их до формата JPEG.Вы можете поиграть с качеством сжатия, чтобы найти подходящее место.

guard let imageRep = UIImageJPEGRepresentation(image, 0.3) else { return }
...