Wie löse ich diesen CollectionView-Absturz?
Meine App hat zweiCollectionViewController
s. Es ist immer nur einer sichtbar.
Ich habe auf dem Storyboard die folgende Struktur erstellt: zwei Containeransichten übereinander. Jede Containeransicht hat einCollectionViewController
eingebettet. Die Sichtbarkeit einer bestimmten Containeransicht bestimmt, welcher collectionViewController sichtbar ist.
Das ist das Problem. BeideCollectionViewController
s empfangen Daten parallel, aber iOS hat einen Fehler, der die App zum Absturz bringt, wenn ein CollectionViewController versucht, eine Einfügung mit @ auszuführeperformBatchUpdates
während es unsichtbar ist.
m dies zu verhindern, habe ich auf beiden Seiten ein BOOL-Flag erstellCollectionViewController
s, damit sie wissen, ob sie sichtbar sind und das @ ausführen oder nicperformBatchUpdates
. Etwas wie
if (self.isThisCollectionViewVisible == NO) return;
[self.collectionView performBatchUpdates:^{
// bla bla... perform insert,m remove...
Dies löst einen Teil des Problems. Die App stürzt jedoch weiterhin ab, wenn ich auf die Schaltfläche tippe, um zum unsichtbaren @ zu wechselCollectionViewController
sichtbar machen, während Updates empfangen werden.
Ich meine das: Lass uns @ anrufA
Der ErsteCollectionViewController
undB
der zweite.A
ist sichtbar undB
ist zu diesem Zeitpunkt nicht sichtbar.B
empfängt Daten und versucht ein @ zu machperformBatchUpdates
aber da es unsichtbar ist, wird dasif (self.isThisCollectionViewVisible == NO) return;
verhindertperformBatchUpdates
zu laufen, was ist in Ordnung. Jetzt mache ichA
unsichtbar undB
sichtbar. An dieser Stelle wird die Flaggeself.isThisCollectionViewVisible
ist eingestellt aufYES
undperformBatchUpdates
bringt die App mit diesem Fehler zum Absturz:
* Assertionsfehler in - [CollectionView _endItemAnimationsWithInvalidationContext: tentionallyForReordering:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3512.60.7/UICollectionView.m:4625 * Beenden der App aufgrund einer nicht erfassten Ausnahme 'NSInternalInconsistencyException', Grund: 'Ungültige Aktualisierung: Ungültige Anzahl von Elementen in Abschnitt 0. Die Anzahl der Elemente in einem vorhandenen Abschnitt nach der Aktualisierung (76) muss der Anzahl der Elemente in entsprechen dieser Abschnitt vor der Aktualisierung (70) plus oder minus der Anzahl der in diesen Abschnitt eingefügten oder gelöschten Elemente (5 eingefügten, 2 gelöschten) und plus oder minus der Anzahl der in diesen Abschnitt eingefügten oder herausgezogenen Elemente (0 eingefügten, 0 eingefügten Elemente) ausgezogen).'
Ich denke derCollectionViewController
ist wirklich noch nicht fertig und aktualisiert, um ein @ machen zu könnperformBatchUpdates
... und dies bedeutet nicht, dass die Datenquelle zuvor nicht aktualisiert wurde, da sie gerade aktualisiert wird.
Was kann ich tun, um dies zu verhindern?
HINWEIS: Ich habe etwas Merkwürdiges an diesem Absturz bemerkt. Es heißt, dass 5 Elemente eingefügt und 2 gelöscht werden, aber tatsächlich werden 3 Elemente eingefügt, 0 gelöscht und 2 geändert, wenn die Abstürze auftreten.