uitableviewcell - ¿Trucos para mejorar el rendimiento de desplazamiento de iPhone UITableView?
uitableview with multiple custom cells swift (5)
Tengo una buena vista que carga imágenes bastante grandes en cada celda y las alturas de las celdas varían según el tamaño de la imagen. El rendimiento de desplazamiento es decente, pero a veces puede ser desigual.
Encontré estos consejos que encontré en el blog de FieryRobot:
glassy-scrolling-with-uitableview
more-glassy-scrolling-with-uitableview
¿Alguien tiene alguna sugerencia para mejorar el rendimiento de desplazamiento de uitableview?
- Guarda en caché la altura de las filas (la vista de tabla puede solicitarlo con frecuencia)
- Cree una memoria caché utilizada menos recientemente para las imágenes utilizadas en la tabla (e invalide todas las entradas inactivas cuando reciba una advertencia de memoria)
- Dibuje todo en
drawRect:
UITableViewCell
drawRect:
si es posible, evite las subvistas a toda costa (o si necesita la funcionalidad de accesibilidad estándar,drawRect:
la vista de contenidodrawRect:
- Haz que la
UITableViewCell
tuUITableViewCell
opaca (lo mismo ocurre con la vista de contenido si tienes una) - Utilice la funcionalidad reutilizable de
UITableView
según lo recomendado por los ejemplos deUITableView
/ documentación - Evita degradados / efectos gráficos complicados que no están
UIImage
enUIImage
s
- Si está subclasificando
UITableViewCell
, no use un Nib, escríbalo en el código. Es mucho más rápido que cargar archivos Nib. - Si está usando imágenes, asegúrese de que las está almacenando en la memoria caché para que no tenga que cargarlas desde el archivo más de una vez para cada una (si tiene memoria, se sorprendería de la cantidad de espacio que ocupan las imágenes).
- Haz la mayor cantidad posible de elementos opacos. Del mismo modo, intente no y use imágenes con transparencia.
# 1 asesino de rendimiento para desplazamiento de UITableView está dibujando sombras en cualquier capa de vista de celda, por lo que si el rendimiento del desplazamiento importa, entonces no haga sombras a menos que, básicamente, no ralentice su hilo principal.
pensé que esto tenía que decirse ya que ninguna de las respuestas aceptadas mencionaba sombras y capas. : +)
Cualquier problema con el UITableView
desplazamiento de UITableView
puede resolverse utilizando técnicas ya descritas en otras respuestas. Sin embargo, muchas veces el rendimiento lento es causado por algo intrínsecamente erróneo o repetitivo.
El hecho de que UITableView
las celdas y el hecho de que cada celda pueda necesitar su propia imagen hace que la solución sea un poco compleja. De cómo se está resolviendo de manera general, aquí resumo cosas que deben ser atendidas:
- Cargar datos en el origen de datos: desde REST / base de datos. Este paso debe hacerse en segundo plano, utilizando finalmente dispatch_async junto con la cola de GCD.
- Cree e inicialice objetos de modelo de datos relevantes y colóquelos dentro de una matriz
-
[tableView reloaddata]
- Dentro de
cellForRowAtIndexPath
, incluya el código que establecerá los datos (texto) del objeto de modelo de datos correcto de la matriz. - Ahora las imágenes también pueden tener forma de URL, por lo que este paso puede ser poco peculiar debido a la reutilización de células realizada por la vista de tabla. El corazón del hecho es cargar una vez más la imagen desde la memoria caché / URL del dispositivo usando la cola asincrónica, luego configurarla para corregir cell.image (cualquiera que sea su propiedad de imagen de celda).
Para evitar problemas, consulte este tutorial sobre la carga diferida de imágenes dentro de la vista de tabla.
El desarrollador detrás de Tweetie ha escrito extensamente sobre esto y tiene algún código que demuestra cómo se hizo para esa aplicación. Básicamente, aboga por una vista personalizada por celda de la tabla, y dibujarla manualmente (en lugar de subcomprobar con Interface Builder, entre otras opciones).
fast-scrolling-in-tweetie-with-uitableview
Además, Apple ha actualizado su propio código de muestra para TableView en sus tutoriales TableViewSuite (¿tal vez en respuesta a esto?)