NSFetchedResultsController ruft den controllerDidChangeContent-Delegierten mehrmals mit veralteten Ergebnissen auf?

8

Ich habe ein Coredata-Modell-Setup wie folgt:

%Vor%

Und ein NSFetchedResultsController, erstellt mit:

%Vor%

Ich importiere auch Daten über einen sekundären NSManagedObjectContext und führe diese Änderungen wie folgt zusammen:

%Vor%

Ich habe TileListOrders-Objekte hinzugefügt und gelöscht. Es beginnt mit 6 Objekten und 3 Abschnitten, und wenn ich fertig bin, werden die 6 ursprünglichen Objekte gelöscht und 6 neue eingefügt.

Jetzt ist mein Problem, dass auf dem Delegat NSFetchedResultsController, die rechts nach mergeChangesFromContextDidSaveNotification aufgerufen werden: Benachrichtigung

%Vor%

wird ZWEIMAL aufgerufen, wenn es zum ersten Mal 12 Objekte und 3 Abschnitte und das zweite Mal 6 Objekte in 3 Abschnitten druckt.

Bei der Überprüfung der geholten Objekte gibt es zum ersten Mal die 6 eingefügten Objekte plus die anderen 6 ursprünglichen Objekte, die gelöscht wurden. Das zweite Mal enthält es die erwarteten 6 Objekte in 3 Abschnitten.

Betrachten Sie:

%Vor%

Beim ersten Aufruf von controllerDidChangeContent werden nur NSFetchedResultsChangeInsert-Änderungen verarbeitet und beim zweiten Mal ändert sich nur NSFetchedResultsChangeDelete.

Ich habe erwartet, dass controllerDidChangeContent nur aufgerufen wird, nachdem ALLE Änderungen verarbeitet wurden. Wenn dies eine Tabellenansicht steuern würde, würde dies bedeuten, dass die Tabellenansicht zweimal animiert würde. Einmal für die eingefügten Objekte und ein anderes für die gelöschten Objekte. Das Problem ist, dass beim ersten Aufruf des controllerDidChangeContent die Objekte in NSFetchedResultsController, die gelöscht wurden und immer noch im Ergebnis-Array vorhanden sind, nun ungültige Werte für ihre Eigenschaften haben, so dass ein TableView, das diese Elemente anzeigt, wahrscheinlich abstürzen würde.

Jeder hat eine Idee, wie man die Änderungen zusammenführt, so dass der controllerDidChangeContent nur ONCE nach der mergeChangesFromContextDidSaveNotification-Benachrichtigung aufgerufen wird?

----------- AKTUALISIEREN ---------------

Weitere Informationen.

Ich erhalte nur NSManagedObjectContextDidSaveNotification und der localContextDidSave wird nur einmal aufgerufen.

%Vor%

Hier sind die Stack-Spuren. Beim ersten Aufruf von controllerDidChangeContent werden nur Änderungen in Bezug auf INSERTED-Objekte gemeldet, und gelöschte Objekte sind in den NSFetchedResultsController-Ergebnissen immer noch vorhanden. Wie Sie sehen können, wird es von

ausgelöst %Vor%

Das zweite Mal, dass controllerDidChangeContent als Stack-Trace bezeichnet wird, lautet:

%Vor%

Und dieses Mal wird es ausgelöst durch: [NSManagedObjectContext processPendingChanges] () Dieses Mal haben die Ergebnisse von NSFetchedResultsController tatsächlich den gewünschten Status: Die gelöschten Objekte werden entfernt und die eingefügten sind vorhanden.

Mein Problem hier ist, dass die ersten mergeChanges den controllerWillChangeContent mit den collesced-Änderungen auslösen sollten und die Ergebnisse daher in einem konsistenten Zustand sein sollten.

Aus dem ursprünglich geposteten Code habe ich einen [coreManagedObjectContext processPendingChanges]; nach [coreManagedObjectContext mergeChangesFromContextDidSaveNotification: Benachrichtigung]; Denn ohne diesen wird der zweite Aufruf erst beim nächsten Lauf des Runloops ausgelöst.

Ich habe auch versucht [coreManagedObjectContext setPropagatesDeletesAtEndOfEvent: NO]; aber das Verhalten ist das gleiche. Gelöschte Objekte werden nur im zweiten Aufruf entfernt.

    
Sérgio 12.03.2013, 20:02
quelle

0 Antworten