¿Trucos para mejorar el rendimiento de desplazamiento de iPhone UITableView?

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?

  1. Guarda en caché la altura de las filas (la vista de tabla puede solicitarlo con frecuencia)
  2. 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)
  3. 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 contenido drawRect:
  4. Haz que la UITableViewCell tu UITableViewCell opaca (lo mismo ocurre con la vista de contenido si tienes una)
  5. Utilice la funcionalidad reutilizable de UITableView según lo recomendado por los ejemplos de UITableView / documentación
  6. Evita degradados / efectos gráficos complicados que no están UIImage en UIImage s
  1. Si está subclasificando UITableViewCell , no use un Nib, escríbalo en el código. Es mucho más rápido que cargar archivos Nib.
  2. 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).
  3. Haz la mayor cantidad posible de elementos opacos. Del mismo modo, intente no y use imágenes con transparencia.

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).

desplazamiento rápido-en-tweetie-con-uitablevista

Además, Apple ha actualizado su propio código de muestra para TableView en sus tutoriales TableViewSuite (¿tal vez en respuesta a esto?)

TableViewSuite

# 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:

  1. 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.
  2. Cree e inicialice objetos de modelo de datos relevantes y colóquelos dentro de una matriz
  3. [tableView reloaddata]
  4. Dentro de cellForRowAtIndexPath , incluya el código que establecerá los datos (texto) del objeto de modelo de datos correcto de la matriz.
  5. 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.