He estado ejecutando un rendimiento de desplazamiento lento y he notado que cuando me desplazo y se llama a setImage con imágenes no almacenadas en caché, el rendimiento se retrasa mientras se realiza la descarga.
if let imageURL = URL(string: presentable.imageUrl) { let resource = ImageResource(downloadURL: imageURL) photoView.kf.setImage(with: resource, options: [.transition(.fade(0.2))]) } Tengo entendido que Kingfisher los descarga en un subproceso en segundo plano y luego los muestra en el subproceso principal, pero el subproceso principal parece estar bloqueado temporalmente. Eliminar el .transition no ayuda a la situación.
¿Alguna idea sobre cómo mejorar el rendimiento de mi desplazamiento? Gracias
Cuando las imágenes son más grandes que la vista de la imagen, iOS necesita manipular objetos UIImage de gran tamaño, lo que puede causar tartamudeos observables en la interfaz de usuario. Puede evitar ese problema cambiando el tamaño de las imágenes antes de usarlas.
Afortunadamente, Kingfisher tiene un procesador que puede cambiar el tamaño de estos (en un subproceso de fondo) por usted. Como dice la hoja de trucos :
Uso de
DownsamplingImageProcessorpara imágenes de alta resoluciónPiense en el caso en que queremos mostrar algunas imágenes grandes en una vista de tabla o una vista de colección. En el mundo ideal, esperamos obtener miniaturas más pequeñas para ellos, para reducir el tiempo de descarga y el uso de memoria. Pero en el mundo real, tal vez su servidor no prepare una versión en miniatura para usted. El recién agregado
DownsamplingImageProcessorrescata [sic]. Reduce la muestra de las imágenes de alta resolución a un tamaño determinado antes de cargarlas en la memoria:imageView.kf.setImage( with: resource, placeholder: placeholderImage, options: [ .processor(DownsamplingImageProcessor(size: imageView.size)), .scaleFactor(UIScreen.main.scale), .cacheOriginalImage ])Por lo general,
DownsamplingImageProcessorse usa con.scaleFactory.cacheOriginalImage. Proporciona una escala de píxeles de imagen razonable para su interfaz de usuario y evita descargas futuras al almacenar en caché la imagen original de alta resolución.
Creé una pequeña prueba con imágenes pequeñas y confirmé que era suave como la seda, pero cuando usé imágenes grandes, experimenté tartamudeos en el comportamiento de desplazamiento. Pero cuando agregué este DownsamplingImageProcessor en el escenario de imagen grande, volvió a ser suave como la seda.
Actualizando
self.imageView.contentMode = .scaleAspectFillpara
self.imageView.contentMode = .scaleAspectFithizo el truco para mí.
He incrustado UICollectionView dentro UITableViewCell . Cada UICollectionViewCell tiene una vista de imagen que carga la imagen desde la URL usando Kingfisher. El desplazamiento de mi vista de tabla era muy desigual e intenté diferentes cosas, incluido no vincular el modelo y configurar los datos a cada celda. Pero nada hizo ninguna diferencia en absoluto. Una vez que cambié el modo de contenido de la vista de imagen, ahora se desplaza muy suavemente.
Según la respuesta de Rob, también es posible que se requiera configurar el modo en .scaleAspectFill para realizar algún procesamiento, aunque el tamaño de la imagen es más pequeño (incluso 480 x 320 en mi caso). Después de actualizar el modo a .scaleAspectFit , ahora se desplaza suavemente incluso para imágenes de gran tamaño.