Wie man dieses Problem lösen CollectionView crash?
Meine app hat zwei CollectionViewController
s. 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 CollectionViewController
s 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 CollectionViewController
s, 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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für mich hinzufügen
self.collectionView.numberOfItemsInSection(0)
behoben, der Absturz.Der collectionView hat Probleme beim einfügen von Elementen, wenn es nicht sichtbar ist.
Scheint, wie ich nicht allein bin mit meiner Lösung: http://www.openradar.me/15262692
Dieser Absturz erzählte Sie, dass Sie nicht aktualisiert Ihre datasource für die Sammlung. Sie müssen aktualisieren Sie Ihre Datenquelle (array oder ein dictionary) und laden Sie die Sammlung von Daten anzeigen nach der Durchführung
performBatchUpdates
.Ungültig-update: ungültige Anzahl von Elementen in Abschnitt 0. Die Anzahl der enthaltenen Elemente in eine bestehende Strecke nach dem update (76) muss gleich sein der Anzahl der enthaltenen Elemente in diesem Abschnitt, bevor Sie das update (70), plus oder minus der Anzahl der Elemente, die eingefügt oder gelöscht, der Abschnitt (5 eingefügt, 2 gelöscht) und plus oder minus der Anzahl der Elemente bewegt, die in oder aus diesem Abschnitt (0 verschoben, 0 verschoben).'
Wie geschrieben in den apple-docs
So, bewegen Sie die änderungen, bevor Sie die Einlegesohlen und es wird den trick!
performBatchUpdates
ich war leistenden Einsätze, Umzüge und änderungen in dieser Reihenfolge. Sie sagte mir, sich zu setzen, zu löschen, bevor Sie einfügen. Das habe ich gemacht und es weiterhin zu Abstürzen, aber dann zog ich die änderungen, bevor Sie die Einlegesohlen und es hat den trick. Nun ist es nicht abstürzt. Bitte fügen Sie dieses update, um Ihre Antwort so kann ich es akzeptieren. DANKE!!!!!Begegnet den gleichen Fehler heute, für mich, in performBatchUpdates block ersetzen:
mit dabei:
Pflegen die index von mir, es ist OK jetzt. Sollte der Fehler nicht zugeordnet werden-Datenquelle, wenn Sie gehabt haben, aktualisieren Sie die Datenquelle. Es ist vielleicht im Zusammenhang mit der Wiederverwendung von Zellen.