Wie man dieses Problem lösen CollectionView crash?

Meine app hat zwei CollectionViewControllers. Nur eine sichtbar ist, zu einer bestimmten Zeit.

Ich haben die folgende Struktur auf storyboard: zwei container-Ansichten übereinander. Jeder container view hat eine CollectionViewController eingebettet. Die Sichtbarkeit einer bestimmten container-Ansicht bestimmt, welche collectionViewController sichtbar ist.

Dies ist das problem. Beide CollectionViewControllers empfangen Daten parallel, aber iOS hat einen bug, dass die app Abstürzen, wenn eine CollectionViewController versucht, eine insert mit performBatchUpdates während er unsichtbar ist.

Versuchen zu verhindern, dass ich erstellt haben, ein BOOL-flag auf beiden CollectionViewControllers, so Sie wissen können, wenn Sie sichtbar sind, und führen oder nicht performBatchUpdates. So etwas wie:

if (self.isThisCollectionViewVisible == NO) return;

[self.collectionView performBatchUpdates:^{
   //bla bla... perform insert,m remove...

Löst dies ein Teil des Problems. Aber die app weiterhin Abstürzen, unter folgender Bedingung: wenn ich Tippen Sie auf die Schaltfläche wechseln Sie in die unsichtbare CollectionViewController so dass es sichtbar ist, während es updates erhalten.

Meine ich: nennen A den ersten CollectionViewController und B die zweite. A sichtbar ist und die B unsichtbare an dieser Stelle. B beginnt empfangen von Daten und ist versuchen zu tun, ein performBatchUpdates da es aber unsichtbar ist, das if (self.isThisCollectionViewVisible == NO) return; verhindert performBatchUpdates zu laufen, was in Ordnung ist. Jetzt mache ich A unsichtbare und B sichtbar. An diesem Punkt ist die Flagge self.isThisCollectionViewVisible eingestellt ist YES und performBatchUpdates macht die app zum Absturz mit dieser Fehlermeldung:

* Assertion failure in[CollectionView _endItemAnimationsWithInvalidationcontext:tentativelyForReordering:], /BuildRoot/Library/Caches/com.apple.xbs/Quellen/UIKit/UIKit-3512.60.7/UICollectionView.m:4625
*
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Ungültiges update: ungültige
Anzahl der Elemente in Abschnitt 0. Die Anzahl der Elemente, die in einer
bestehenden Abschnitt nach dem update (76) muss gleich der Anzahl der
enthaltene Elemente in diesem Abschnitt, bevor Sie das update (70), plus oder minus
die Anzahl der Elemente, die eingefügt oder gelöscht, der Abschnitt (5 eingefügt,
2 gelöscht) und plus oder minus die Anzahl der Elemente verschoben, in die bzw. aus der
Abschnitt (0 verschoben, 0 verschoben).'

Ich denke, die CollectionViewController ist wirklich noch nicht bereit und aktualisiert, um in der Lage zu tun, ein performBatchUpdates... und das ist nicht eine Frage der nicht die Aktualisierung der Datenquelle vorher an, weil es gerade aktualisiert wird.

Welche überprüfungen kann ich tun, um das zu verhindern?

HINWEIS: ich bemerkte etwas seltsames über diesen Absturz insbesondere. Es sagt, dass die 5-Elemente eingefügt werden und 2 gelöscht, aber in der Tat 3 Elemente eingefügt, gelöscht 0 und 2 verändert, wenn die Abstürze passieren.

  • Sie haben erwähnt, dass iOS wurde ein bug im Zusammenhang zu performBatchUpdates. Wie haben Sie selbst dies bestimmen? Sind Sie sicher, dass das Problem nicht mit deinem code? Mit einem flag zu prüfen, sichtbar/unsichtbar, wohl unzuverlässig sein.
  • Ich fand eine Reihe von radar-Einträgen, die zur Fehler von performBatchUpdates aber trotzdem, in diesem Fall bin ich nicht mit der fahne mehr. Das war nur ein Versuch, um zu sehen, wo das problem war.
InformationsquelleAutor SpaceDog | 2016-03-31
Schreibe einen Kommentar