Основная нить блокируется при прокрутке, а Kingfisher устанавливает изображение - PullRequest
0 голосов
/ 08 января 2019

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

if let imageURL = URL(string: presentable.imageUrl) {
    let resource = ImageResource(downloadURL: imageURL)
    photoView.kf.setImage(with: resource, options: [.transition(.fade(0.2))])
}

Насколько я понимаю, Kingfisher загружает их в фоновом потоке, а затем отображает их в основном потоке, но основной поток, похоже, временно заблокирован. Удаление .transition не поможет ситуации.

Есть идеи, как улучшить производительность прокрутки? Спасибо

1 Ответ

0 голосов
/ 08 января 2019

Когда изображения больше, чем изображение, iOS необходимо манипулировать большими UIImage объектами, что может вызвать заметное заикание в пользовательском интерфейсе. Если вы измените размер изображения соответствующим образом (в фоновом потоке), это может решить эту проблему.

К счастью, в Kingfisher есть процессор, который может сделать это за вас. Как гласит Шпаргалка :

Использование DownsamplingImageProcessor для изображений с высоким разрешением

Подумайте о случае, когда мы хотим показать несколько больших изображений в виде таблицы или коллекции. В идеальном мире мы ожидаем получить для них уменьшенные эскизы, чтобы сократить время загрузки и использование памяти. Но в реальном мире, возможно, ваш сервер не готовит такую ​​миниатюрную версию для вас. Недавно добавленный DownsamplingImageProcessor спасает. Перед загрузкой в ​​память он уменьшает изображения высокого разрешения до определенного размера:

imageView.kf.setImage(
    with: resource,
    placeholder: placeholderImage,
    options: [
        .processor(DownsamplingImageProcessor(size: imageView.size)),
        .scaleFactor(UIScreen.main.scale),
        .cacheOriginalImage
    ])

Обычно DownsamplingImageProcessor используется с .scaleFactor и .cacheOriginalImage. Он обеспечивает разумный масштаб изображения в пикселях для вашего пользовательского интерфейса и предотвращает последующую загрузку путем кэширования исходного изображения с высоким разрешением.

Я создал небольшой тест с маленькими изображениями и подтвердил, что он был гладким и шелковистым, но когда я использовал большие изображения, я испытал заикание в режиме прокрутки. Но когда я добавил это DownsamplingImageProcessor в сценарий с большим изображением, оно снова стало гладким и шелковистым.

...