ios - example - uicollectionview custom cell
¿Está llamando a UICollectionView.reloadData() mala práctica? Si es así, ¿por qué? (5)
Trabajé con un desarrollador brillante una vez que más o menos se negó a llamar alguna vez a reloadData()
en un UICollectionView
.
Incluso frunció el ceño ante collectionView.reloadItemsAtIndexPaths(collectionView.indexPathsForVisibleItems())
, prefiriendo en su lugar recargar solo las rutas de índice exactas que requerían una actualización visual.
Recogí esto, pero estoy luchando para pensar qué problemas específicamente serían causados por un reloadData()
genérico reloadData()
. Por supuesto, si tiene costosos efectos secundarios provocados por una recarga, eso es una cosa. Pero si su fuente de datos en sí misma está colgando, ¿por qué no reloadData()
como una forma fácil de actualizar la vista de colección?
¿Qué problemas causará esta práctica?
Como una negativa general, creo que es exagerado. Habrá algunos aumentos de rendimiento si la tabla es grande, y si los artículos son caros de crear. Si el número de elementos por fila puede variar y recarga el artículo # 317 de 500 artículos, entonces sabe que el número de artículos en todas las filas anteriores no ha cambiado, por lo que no necesita volver a calcularlo. Pero si solo tiene 20 elementos, por lo general no hace mucha diferencia.
Esto no es solo en el método de recarga en collectionView
. pero el mismo problema con Tableview
. No sé si conoce el método de recarga de tableview
y collectionView
. Estoy explicando por casualidad.
Cuando llamas al método de reload
. OS Verifique todas visible
celdas visible
. y llame cellForRow
método cellForRow
para todas las celdas. Significa que el código realiza algo extra. que son innecesarios. Así que es la forma perfecta de llamar a reloadItemsAtIndexPaths
para volver a cargar solo aquellas celdas que necesitan actualizarse.
Supongamos que collectionView
tiene 20 celdas visibles. tener una imagen que está configurada en el método cellForRow
. ahora desea actualizar la imagen en la celda 11. si llama al método de recarga, entonces cellForRow
llamará a todas y cada una de las celdas. Pero si usa reloadItemsAtIndexPaths
y solo un indexPath
, solo ejecutará cellForRow
una vez que sea para la celda 11.
Solo te da un poco de rendimiento. Si tiene muchos artículos, entonces, para volver a cargar algunos artículos, no tiene que volver a cargar todo el CollectionView. Pero si tiene pocos artículos, entonces no es tan costoso.
El caso es que se trata de una pequeña ganancia de rendimiento para algunos artículos. Pero es una buena práctica. Entonces, la elección es tuya.
reloadData
y reloadItemsAtIndexPaths
solo harán que se reloadData
y reloadItemsAtIndexPaths
a mostrar las celdas de las filas que tienen una celda visible asociada.
Entonces, dado que el número de celdas visibles generalmente no cambia y generalmente son pequeñas (por ejemplo, de 5 a 20 como máximo), el trabajo general para representar celdas siempre es constante e independiente en la cantidad de elementos en su modelo de datos.
A diferencia de reloadItemsAtIndexPaths
, que vuelve a presentar selectivamente las celdas visibles especificadas, reloadData
actualizará todas las celdas visibles actualmente, y también actualizará las vistas subyacentes y asociadas cuando haya cambiado la cantidad de elementos del modelo (por ejemplo, ajustar la barra de desplazamiento y la altura de la vista )
Puede usar reloadItemsAtIndexPaths
por razones de rendimiento, pero en general no es obligatorio, y muchas veces no se recomienda, ya que también debe tener en cuenta la cantidad de elementos en otros lugares de su código.
No, no es una mala práctica en absoluto.
Solo una breve descripción, Entonces obtienes tu respuesta
UICollectionView está altamente optimizado y, por lo tanto, solo conserva las filas visibles en pantalla en la memoria. Ahora, todas las filas Las celdas se almacenan en caché en el grupo y se reutilizan y no se regeneran. Cuando el usuario navega por UICollectionView, agrega las filas ocultas en Pool y las reutiliza para que las siguientes sean filas visibles.
Entonces, cuando llamas a reloadData (), simplemente actualiza los datos en celdas de fila, como actualizar el texto de UILabel y la actualización ocurre solo para celdas visibles, y el proceso continúa.
Ahora, considere que tiene diez filas visibles en su vista de colección y mientras llama
reloadItemsAtIndexPaths (collectionView.indexPathsForVisibleItems ())
simplemente actualice los elementos similares a UILabel solo para esos elementos, pero si llama a reloadData (), actualiza los datos para diez elementos visibles, lo que no hace ninguna diferencia, ya que es un proceso muy ligero.
Deberías usar reloadData () en todas partes. Mantenlo simple y legible. En cuanto a rendimiento, reloadItems no hace ninguna diferencia.
Está bien elaborado en Apple Docx
Llame a este método para volver a cargar todos los artículos en la vista de colección. Esto hace que la vista de colección descarte los elementos actualmente visibles y los vuelva a mostrar. Para mayor eficiencia, la vista de colección solo muestra aquellas celdas y vistas suplementarias que son visibles. Si los datos de recopilación se reducen como resultado de la recarga, la vista de recopilación ajusta sus desplazamientos de desplazamiento en consecuencia.