Obtención de carga frente a celdas visibles en un UITableView o UICollectionView
uicollectionviewcell ios10 (1)
TL; DR
- Tome los nombres
visible
en función literalmente. - UITableView se comporta como lo hizo en iOS 9.
- Deberá llevar un poco de contabilidad si desea tratar las celdas cargadas frente a las visibles en UICollectionView en iOS 10.
UITableView y UICollectionView parecen comportarse de manera muy diferente cuando se trata de la captura previa.
Lo primero que hay que notar es que hay una diferencia entre las celdas de captación previa y los datos de captación previa:
- Las celdas de
cellForRowAtIndexPath
refieren acellForRowAtIndexPath
se llama antes de que la celda se muestre en la pantalla. Esto habilita el escenario donde tienes celdas que están fuera de la pantalla pero que aún están cargadas. - Los datos de
indexPaths
se refieren a los métodosprefetchDataSource
que le informan sobreindexPaths
que se mostrarán en la pantalla. No tiene una referencia a la celda cuando se llama a este método y no devuelve una celda cuando se llama a este método. En su lugar, este método debería hacer cosas como disparar una solicitud de red para descargar una imagen que se mostrará en la celda.
Nota: En todos estos escenarios, imagine que hay 8 celdas que se pueden mostrar en un momento dado.
UITableView : (opciones: no prefetching
captura previa o prefetch data
captura previa )
- No precarga de células , nunca. En otras palabras, nunca llamará a
cellForRowAtIndexPath
en unaindexPath
que no se muestra. - Como tal, no hay ninguna propiedad
isPrefetchingEnabled
en un UITableView. - Puede optar por la
prefetchDataSource
previa de datos utilizandoprefetchDataSource
. - Tenga en cuenta que aunque la vista de la tabla parece ser menos agresiva con la reutilización de las celdas , todavía parece llamar a
cellForItemAtIndexPath
cuando la celda reutilizada vuelve acellForItemAtIndexPath
en la pantalla. (Aunque es posible que tenga que investigar un poco más sobre esto, especialmente para las vistas de colección).
UICollectionView : (opciones: no prefetching
captura previa , prefetch cells
captura previa o prefetch cells and data
captura previa )
- Prefetches celdas por defecto. En otras palabras, llamará a
cellForItemAtIndexPath
para las celdas que no se mostrarán inmediatamente. - La captura previa de celdas solo comienza cuando el usuario se desplaza hacia arriba o hacia abajo en la vista de colección. En otras palabras, recibirá exactamente 8 llamadas a
cellForItemAtIndexPath
cuando secellForItemAtIndexPath
la vista. Solo una vez que el usuario se desplaza hacia abajo comenzará a solicitar celdas no visibles (por ejemplo, si se desplazó hacia abajo para mostrar 2-10, podría pedir 11-14). - Cuando la celda no visible y
cellForItemAtIndexPath
en la pantalla, nocellForItemAtIndexPath
a llamar acellForItemAtIndexPath
. Asumirá que la creación de instancias que hiciste la primera vez sigue siendo válida. - Puede optar por la
prefetchDataSource
previa de datos utilizandoprefetchDataSource
. - El
prefetchDataSource
resulta ser solo útil para la carga inicial. En el mismo escenario anterior, cuando se muestran las primeras 8 celdas, puede disparar una búsqueda previa de datos para las celdas 9-14, por ejemplo. Sin embargo, una vez que se llama este método inicial, es inútil a partir de entonces. Esto se debe a que secellForItemAtIndexPath
inmediatamente después de cada llamada aprefetchItemsAt
. Por ejemplo, obtendráprefetchItemsAt:[14, 15]
seguido inmediatamente porcellForItemAt:14
,cellForItemAt:15
. - Puede optar por excluirse de todo comportamiento de prefetching configurando
isPrefetchingEnabled = false
. Esto significa que no puede hacer que un UICollectionView se comporte de manera similar a un UITableView con unprefetchDataSource
. O, en otras palabras, no puede tener soloprefetch data
captación previa de UICollectionView.
Para ambos :
-
visibleCells
,indexPathsForVisibleRows
ycellForItemAtIndexPath
hacen exactamente lo que dicen: solo tratan con celdas visibles . En nuestro mismo escenario, si tenemos 20 celdas cargadas, pero solo 8 están visibles en la pantalla. Los 3 de estos métodos solo informarán sobre las 8 celdas en pantalla.
Entonces, ¿qué significa esto?
- Si está utilizando un UITableView, puede usarlo tal como está y nunca debe preocuparse por la diferencia entre las celdas cargadas y las visibles. Siempre son equivalentes.
- Para UICollectionView, por otro lado, tendrá que hacer un poco de contabilidad para realizar un seguimiento de las celdas cargadas, no visibles frente a las celdas visibles, si le importa esta diferencia. Puede hacer esto mirando algunos de los métodos en el origen de datos y los métodos delegados (por ejemplo, willDisplayCell, didEndDisplayingCell).
Con la introducción de iOS 10, parece que vamos a tener habilitada la captura previa habilitada de forma predeterminada en UITableView y UICollectionViews . Esto significa que las celdas que no se muestran en la pantalla se recuperarán antes de que el usuario las vea.
Aquí hay algunos métodos relevantes:
- cellForRowAtIndexPath: devuelve "
nil
si la celda no está visible". - visibleCells : cada elemento representa "una celda visible en la vista de tabla".
- indexPathsForVisibleRows : cada elemento representa "una fila visible en la vista de tabla".
- visibleCells : "devuelve la lista completa de celdas visibles mostradas por la vista de colección".
- indexPathsForVisibleItems : cada elemento representa "una celda visible en la vista de colección".
- cellForItemAtIndexPath: devuelve "
nil
si la celda no está visible".
Todos estos específicamente mencionan "visible" en sus descripciones. Con la introducción de la captura previa en iOS 10, ¿cómo distinguiría entre una celda que fue pre-buscada y una que es visible actualmente?
En otras palabras:
- ¿Cómo consigo todas las células visibles?
- ¿Cómo consigo todas las celdas cargadas?
No parece que haya nuevas API en UITableView o UICollectionView que puedan ayudar con esto.