uitableview uicollectionview uicollectionviewcell ios10

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 a cellForRowAtIndexPath 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étodos prefetchDataSource que le informan sobre indexPaths 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 una indexPath que no se muestra.
  • Como tal, no hay ninguna propiedad isPrefetchingEnabled en un UITableView.
  • Puede optar por la prefetchDataSource previa de datos utilizando prefetchDataSource .
  • 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 a cellForItemAtIndexPath 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 se cellForItemAtIndexPath 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, no cellForItemAtIndexPath a llamar a cellForItemAtIndexPath . Asumirá que la creación de instancias que hiciste la primera vez sigue siendo válida.
  • Puede optar por la prefetchDataSource previa de datos utilizando prefetchDataSource .
  • 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 se cellForItemAtIndexPath inmediatamente después de cada llamada a prefetchItemsAt . Por ejemplo, obtendrá prefetchItemsAt:[14, 15] seguido inmediatamente por cellForItemAt: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 un prefetchDataSource . O, en otras palabras, no puede tener solo prefetch data captación previa de UICollectionView.

Para ambos :

  • visibleCells , indexPathsForVisibleRows y cellForItemAtIndexPath 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:

UITableView :

UICollectionView :

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:

  1. ¿Cómo consigo todas las células visibles?
  2. ¿Cómo consigo todas las celdas cargadas?

No parece que haya nuevas API en UITableView o UICollectionView que puedan ayudar con esto.