¿Cómo resolver este bloqueo de CollectionView?
Mi aplicación tiene dosCollectionViewController
s. Solo uno es visible en un momento dado.
He creado la siguiente estructura en el guión gráfico: dos vistas de contenedor una encima de la otra. Cada vista de contenedor tiene unCollectionViewController
incrustado. La visibilidad de una vista de contenedor particular determina qué collectionViewController es visible.
Este es el problema. AmbosCollectionViewController
s están recibiendo datos en paralelo, pero iOS tiene un error que hará que la aplicación se bloquee si un CollectionViewController intenta ejecutar una inserción usandoperformBatchUpdates
mientras es invisible
Intentando evitar eso, he creado una bandera BOOL en ambosCollectionViewController
s para que puedan saber si son visibles y ejecutar o noperformBatchUpdates
. Algo como:
if (self.isThisCollectionViewVisible == NO) return;
[self.collectionView performBatchUpdates:^{
// bla bla... perform insert,m remove...
Esto resuelve parte del problema. Pero la aplicación continúa fallando en la siguiente condición: si toco el botón para cambiar a lo invisibleCollectionViewController
haciéndolo visible mientras recibe actualizaciones.
Quiero decir esto: llamemosA
el primeroCollectionViewController
yB
el segundo.A
es visible yB
Es invisible en este punto.B
comienza a recibir datos y está tratando de hacer unperformBatchUpdates
pero como es invisible, elif (self.isThisCollectionViewVisible == NO) return;
está previniendoperformBatchUpdates
correr, lo que está bien. Ahora hagoA
invisible yB
visible. En este punto la banderaself.isThisCollectionViewVisible
se establece enYES
yperformBatchUpdates
hace que la aplicación se bloquee con este error:
* Error de aserción en - [CollectionView _endItemAnimationsWithInvalidationContext: tentativelyForReordering:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3512.60.7/UICollectionView.m:4625 * Finalización de la aplicación debido a la excepción no detectada 'NSInternalInconsistencyException', razón: 'Actualización no válida: número no válido de elementos en la sección 0. El número de elementos contenidos en una sección existente después de la actualización (76) debe ser igual al número de elementos contenidos en ese sección antes de la actualización (70), más o menos el número de elementos insertados o eliminados de esa sección (5 insertados, 2 eliminados) y más o menos el número de elementos movidos dentro o fuera de esa sección (0 movidos, 0 movidos fuera).'
Pienso que elCollectionViewController
Realmente aún no está listo y actualizado para poder hacer unperformBatchUpdates
... y no se trata de no actualizar la fuente de datos previamente porque se está actualizando.
¿Qué controles puedo hacer para evitar que eso suceda?
NOTA: Noté algo extraño sobre este bloqueo en particular. Dice que se están insertando 5 elementos y se eliminan 2, pero de hecho se insertan 3 elementos, se eliminan 0 y se cambian 2 cuando ocurren los bloqueos.