Como resolver esta falha do CollectionView?
Meu aplicativo tem doisCollectionViewController
s. Apenas um é visível em um determinado momento.
Eu criei a seguinte estrutura no storyboard: duas visualizações de contêineres umas sobre as outras. Toda visualização de contêiner possui umCollectionViewController
embutido. A visibilidade de uma visualização de contêiner específica determina qual collectionViewController está visível.
Este é o problema. AmbosCollectionViewController
s estão recebendo dados em paralelo, mas o iOS possui um erro que causará o travamento do aplicativo se um CollectionViewController tentar executar uma inserção usandoperformBatchUpdates
enquanto é invisível.
Tentando evitar isso, criei uma bandeira BOOL nos doisCollectionViewController
s para que eles possam saber se estão visíveis e executar ou não operformBatchUpdates
. Algo como:
if (self.isThisCollectionViewVisible == NO) return;
[self.collectionView performBatchUpdates:^{
// bla bla... perform insert,m remove...
Isso resolve parte do problema. Mas o aplicativo continua a travar na seguinte condição: se eu tocar no botão para alternar para o invisívelCollectionViewController
tornando-o visível enquanto recebe atualizações.
Quero dizer o seguinte: vamos ligarA
o primeiroCollectionViewController
eB
o segundo.A
é visível eB
é invisível neste momento.B
começa a receber dados e está tentando fazer umaperformBatchUpdates
mas como é invisível, oif (self.isThisCollectionViewVisible == NO) return;
está impedindoperformBatchUpdates
para correr, o que é bom. Agora eu façoA
invisível eB
visível. Neste ponto, a bandeiraself.isThisCollectionViewVisible
está configurado paraYES
eperformBatchUpdates
faz com que o aplicativo falhe com este erro:
* Falha de declaração em - [CollectionView _endItemAnimationsWithInvalidationContext: tentativelyForReordering:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3512.60.7/UICollectionView.m:4625 * Finalizando o aplicativo devido à exceção não capturada 'NSInternalInconsistencyException', motivo: 'Atualização inválida: número inválido de itens na seção 0. O número de itens contidos em uma seção existente após a atualização (76) deve ser igual ao número de itens contidos nessa seção antes da atualização (70), mais ou menos o número de itens inseridos ou excluídos dessa seção (5 inseridos, 2 excluídos) e mais ou menos o número de itens movidos para dentro ou para fora dessa seção (0 movido, 0 movido Fora).'
Eu acho que oCollectionViewController
ainda não está pronto e atualizado para poder fazer umaperformBatchUpdates
... e não se trata de não atualizar a fonte de dados anteriormente porque está sendo atualizada.
Que verificações posso fazer para impedir que isso aconteça?
NOTA: notei algo estranho sobre esse acidente em particular. Ele diz que 5 elementos estão sendo inseridos e 2 excluídos, mas de fato 3 estão sendo inseridos, 0 excluído e 2 alterados quando ocorrem as falhas.