¿Se convoca a la altura de PromingTexpath para todas las filas y cuántas filas en una vista de UITATION antes de los problemas de rendimiento?

StackOverflow https://stackoverflow.com/questions/5324205

Pregunta

Pensé que había leído eso para un UITableView que heightForRowAtIndexPath No se llama a todas las filas, sino solo en las que serán visibles. Sin embargo, esto no es lo que estoy viendo. Estoy viendo cientos de llamadas a heightForRowAtIndexPath Para la simple situación de la orientación que se cambia del iPhone, por ejemplo.

Así que supongo aquí, por lo tanto, para un UITableView con heightForRowAtIndexPath implementado, lo hace (es decir heightForRowAtIndexPath) Reciba todas las filas (no solo las visibles) ... avíseme si esto no es del todo correcto.

Pregunta: Dado lo anterior, cuántas filas en un UITableView (dónde heightForRowAtIndexPath se implementa) ¿Puede tener antes de que ocurran problemas de rendimiento?

¿Hay alguna manera de evitar los problemas de rendimiento? es decir, establecer una altura nominal/estándar para cada fila y no implementar heightForRowAtIndexPath, pero luego establece correctamente cada altura de la fila solo cuando se muestra y configúrela correctamente aquí ... pero ¿en qué método haría esto?

¿Fue útil?

Solución

Eche un vistazo a la sección de discusión en el tableView:heightForRowAtIndexPath: documentación

El método permite que el delegado especifique filas con alturas variables. Si se implementa este método, el valor que devuelve anula el valor especificado para la propiedad Rowheight de UITableView para la fila dada.

Hay implicaciones de rendimiento en el uso de TableView: HeightForrowatIndExpath: en lugar de la propiedad Rowheight. Cada vez que se muestra una vista de tabla, llama a TableView: HeightForrowatIndExpath: en el delegado para cada una de sus filas, lo que puede dar lugar a un problema de rendimiento significativo con las vistas de la tabla que tiene una gran cantidad de filas (aproximadamente 1000 o más).

Entonces deberías usar el rowHeight Propiedad de UITableView. Si necesita diferentes alturas, no tiene suerte porque tiene que usar tableView:heightForRowAtIndexPath:.

AFAIK no hay forma de cambiar la altura de la fila en la pantalla.
El TableView tiene que saber el tamaño correcto antes, en caso de que habría cambios de posición fea todo el tiempo.

Otros consejos

Creo que encontré una solución a eso.

En iOS 7, Apple introdujo algunas nuevas propiedades de TableView. Uno de ellos es el:

tableView:estimatedHeightForRowAtIndexPath:

Entonces, si suministra una altura de fila estimada, por ejemplo, entonces cuando TableView: HeightForrowatIndExpath: se llama repetidamente antes de que se muestre la tabla, solo se llama para las celdas visibles de la tabla; Para las células restantes, se usa la altura estimada.

Aquí está la fuente de esa información: https://books.google.gr/books?id=wLaVBQAAQBAJ&pg=PT521&lpg=PT521&dq=heightforrowatindexpath+only+for+the+visible+cells&source=bl&ots=7tuwaMT5zV&sig=h3q8AaFvoCgcrPu2fQchVkIEjwg&hl=en&sa=X&ved=0CEMQ6AEwBWoVChMInLK0xbPuxwIVCbUaCh3_nQWG#v=onepage&q=heightforrowatindexpath% 20only%20For%20The%20 Visible%20 Cells & F = Falso

¡Dios mío, pasé más de una hora tratando de encontrar la fuente de mi problema de rendimiento!

Finalmente, también encontré cientos de llamadas a HeightforrowatIndExpath y una búsqueda me consiguió este hilo. Eso es realmente molesto. El rendimiento ya va aquí cuando solo muestra 250 elementos. Afortunadamente, las celdas que quiero mostrar ahora tienen el mismo tamaño. ¡Pero podría imaginar que alguien que quisiera mostrar algunas celdas diferentes para una vista de tabla con> 200 elementos!

¡Arregle esta manzana!

Salud

Una forma de mejorar el rendimiento en las vistas de table con una gran cantidad de filas y alturas de celdas dinámicas es almacenar en caché la altura de las celdas una vez que se calculan por primera vez.

Un enfoque simplista para lograr esto es mantener un NSMutableDictionary en el que la clave es la identificación del registro en la celda (o cualquier otro identificador que pueda tener), y el valor es un NSNumber con la altura de la fila. Una vez que se calcule la altura, guárdela el NSMutableDictionary por la identificación del registro. En el tableView:heightForRowAtIndexPath y tableView:estimatedHeightForRowAtIndexPath: Verifica si hay una altura en caché en el diccionario y la devuelve si se encuentra. Si no se encuentra, calcule la altura y almacene en el caché antes de devolver la altura.

Es posible que deba tener cuidado al invalidar el caché para las filas que cambian las alturas. Por ejemplo, si tiene un botón de expansión en una de sus celdas, deberá eliminar la altura de esa celda de la caché una vez que se llame el método delegado de expansión para la altura.

Es posible que aún tenga un éxito de rendimiento si intenta mostrar 1000 de celdas a la vez cuando la tabla lo muestra, ya que probablemente llamará al método de altura para cada fila. Un trabajo para eso es primero calentar el caché, si es posible en una tarea de fondo, antes de mostrar las celdas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top