uitableviewcell source number example data iphone uitableview

iphone - source - UITableView se bloquea si la fuente de datos se actualiza durante el desplazamiento



uitableviewcell swift 3 (2)

La respuesta corta es que necesita almacenar los datos en su modelo de datos y solo actualizar la tabla con los nuevos datos cuando la tabla no se está desplazando. Esto debe hacerse en el modelo de datos porque el delegado de la fuente de datos no tiene idea de lo que está dentro del modelo de datos o de lo que ha cambiado.

Sin embargo, desde la perspectiva del diseño de la interfaz de usuario, tener una tabla actualizada activamente mientras el usuario se desplaza desorientará al usuario. El usuario pensará que está en la parte superior / media / inferior de la tabla y, de repente, se encuentra en la parte inferior / superior / central. El usuario pensará que ha visto todos los datos en una sección de la tabla, pero en realidad la tabla habrá agregado algo que necesitaban ver. Por ejemplo, si la tabla es una lista de nombres en orden alfabético, el usuario verifica todos los nombres que aparecen con "U", ve que no hay ninguno y luego va a verificar en otro lugar de la tabla. Mientras tanto, la tabla actualiza de forma invisible la sección "U" con nombres nuevos mientras el usuario está buscando en otra parte. Incluso si el usuario entiende que la tabla se actualiza dinámicamente (que la mayoría no lo está), tendrá que desplazarse continuamente para verificar virtualmente toda la tabla para ver qué ha cambiado.

Un mejor diseño de la interfaz de usuario es dar al usuario la posibilidad de actualizar. Coloque un botón "Actualizar" o "Nuevos datos disponibles" en la barra y luego configúrelo para que aparezca cuando lleguen nuevos datos. Al hacer clic en el botón, congelar la tabla, actualizar y solo luego permitir que el usuario reanude la interacción. También sería un buen diseño para marcar visualmente las filas agregadas.

Esto hará que la interfaz de usuario sea más comprensible para el usuario y resuelva su problema de colisión al mismo tiempo.

Edit01:

Si no usa Core Data, para implementar la actualización en vivo e invisible de la tabla. deberá congelar en las llamadas – tableView:numberOfRowsInSection o – numberOfSectionsInTableView: before – tableView:cellForRowAtIndexPath: se llama.

Como – tableView:numberOfRowsInSection se llama a – tableView:numberOfRowsInSection , llamaría para actualizar primero y luego congelar su modelo de datos. De esa manera, el modelo de datos devolverá el número adecuado de secciones y filas.

Supongo que tendrá que dividir su modelo de datos en dos secciones, una de las cuales almacenará datos entrantes y otra que ordenará la visualización de los datos. Su método de actualización debe mover todos los datos almacenados en búfer finalizados a la sección de datos de visualización.

Además, probablemente necesitará configurar un temporizador para cuando el usuario no esté moviendo la mesa. El temporizador debe llamar al método de actualización si la tabla no está siendo manipulada activamente y luego debe forzar una actualización.

Si usa Core Data, puede usar NSFetchedResultController y sus métodos de delegación le informarán cuando cambie el modelo de datos. Debe devolver la información correcta de la sección y la fila actualizada en vivo. Es bastante fácil conducir una tabla de actualización de esta manera. Sin embargo, no solucionará el problema de que los datos ingresen al modelo tan rápidamente que el modelo cambie entre las llamadas de método. Aún tendrá que congelar y / o ralentizar el modelo. Sin embargo, no necesitará el temporizador.

Core Data es su mejor opción, pero aún así será difícil de implementar porque está intentando hacer algo en contra de la interfaz de usuario y, por lo tanto, la API no lo admite fácilmente.

Actualizar:

Mirando hacia atrás sobre esta respuesta, veo que [UITableView beginUpdates] mencionar [UITableView beginUpdates] que congelará la configuración de la tabla mientras se agregan o eliminan filas. Se empareja con [UITableView endUpdates] para incluir los cambios en la interfaz de usuario.

Tengo una aplicación en la que el origen de datos para una UITableView se actualiza mediante un subproceso en segundo plano desde un servidor remoto cada 30 segundos.

Se produce un bloqueo si el usuario está desplazando el tableView o si el tableView está en proceso de reloadTableView: El motivo del bloqueo es que el número de filas en la tabla en el momento del bloqueo no coincide con el número de filas en el momento en que se inició el redibujo.

Otro bloqueo ocurre cuando una celda TableView solicitada está fuera de rango porque, entre el numberofTableViewCells: tiempo de numberofTableViewCells: se llama y el tiempo cellfForRowAtIndexPath , el modelo de datos ha cambiado y la celda ya no está allí.

Los datos para el tableView se actualizan desde un hilo de fondo. Mientras los datos se cargan desde un servidor, el usuario aún debe poder interactuar con tableView, pero en este momento eso provoca una caída.

¿Cómo puedo bloquear el tableView para que no se desplace o recargue mientras actualizo tableViewDataSource? ¿Cuál es la mejor práctica para este tipo de situación?

Gracias.


No es seguro llamar a métodos en objetos GUI (como un UITableView) desde un hilo de fondo.

Necesitas hacer algo como:

[ tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]

Ver uitableview-drawing-problems-when-reloaddata-is-called