Как решить эту ошибку CollectionView?
Мое приложение имеет дваCollectionViewController
s. Только один виден в данный момент.
Я создал следующую структуру на раскадровке: два вида контейнера друг на друга. Каждый вид контейнера имеетCollectionViewController
встроенный. Видимость конкретного контейнерного представления определяет, какая коллекцияViewViewController является видимой.
Это проблема. И то и другоеCollectionViewController
Они получают данные параллельно, но в iOS есть ошибка, которая приводит к сбою приложения, если один CollectionViewController пытается выполнить вставку, используяperformBatchUpdates
пока он невидим
Пытаясь предотвратить это, я создал флаг BOOL на обоихCollectionViewController
s, чтобы они могли знать, если они видны и выполнять или нетperformBatchUpdates
, Что-то вроде:
if (self.isThisCollectionViewVisible == NO) return;
[self.collectionView performBatchUpdates:^{
// bla bla... perform insert,m remove...
Это решает часть проблемы. Но приложение продолжает падать при следующем условии: если я нажму кнопку, чтобы переключиться на невидимоеCollectionViewController
сделать его видимым, пока он получает обновления.
Я имею в виду это: давайте позвонимA
первыйCollectionViewController
а такжеB
второй.A
виден иB
невидим в этой точке.B
начинает получать данные и пытается сделатьperformBatchUpdates
но, как это невидимо,if (self.isThisCollectionViewVisible == NO) return;
предотвращаетperformBatchUpdates
бежать, что нормально. Теперь я делаюA
невидимый иB
видимый. На данный момент флагself.isThisCollectionViewVisible
установлен вYES
а такжеperformBatchUpdates
вызывает сбой приложения с этой ошибкой:
* Ошибка подтверждения в - [CollectionView _endItemAnimationsWithInvalidationContext: ориентировочноForReordering:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3512.60.7/UICollectionView.m:4625 * Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Неверное обновление: недопустимое количество элементов в разделе 0. Количество элементов, содержащихся в существующем разделе после обновления (76), должно быть равно количеству элементов, содержащихся в этом раздел перед обновлением (70), плюс или минус количество элементов, вставленных или удаленных из этого раздела (5 вставлено, 2 удалено) и плюс или минус количество элементов, перемещенных в или из этого раздела (0 перемещено, 0 перемещено из).'
я думаюCollectionViewController
на самом деле еще не готов и обновлен, чтобы иметь возможность сделатьperformBatchUpdates
... и дело не в том, чтобы ранее не обновлять источник данных, потому что он обновляется.
Какие проверки я могу сделать, чтобы этого не случилось?
ПРИМЕЧАНИЕ: я заметил что-то странное в этой аварии, в частности. В нем говорится, что 5 элементов вставляются и 2 удаляются, но на самом деле 3 элемента вставляются, 0 удаляются и 2 изменяются при возникновении сбоев.