NSFetchedResultsChangeUpdate wird anstelle von NSFetchedResultsChangeDelete ausgelöst

9

Ich habe einen NSFetchedResultsController auf folgende Weise initiiert:

%Vor%

Einige Fakten:

  • wasDeleted ist eine NSNumber-Eigenschaft (BOOL) von MyEntity

  • Wenn ich diese Eigenschaft auf [NSNumber numberWithBool:YES] aktualisiere, ruft NSFetchedResultsControllerDelegate didChangeObject auf, löst aber NSFetchedResultsChangeUpdate statt NSFetchedResultsChangeDelete aus.

  • Wenn ich jedoch die Ansicht öffne und den abgerufenen Ergebnis-Controller erneut aktiviere, ist das Objekt nicht mehr vorhanden und zeigt an, dass [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"wasDeleted == %@", [NSNumber numberWithBool:NO]]]; funktioniert.

  • Nach diesem NSFetchedResultsChangeUpdate, wenn cellForRow aufgerufen wird, drucke ich wasDeleted und es wird auf YES gesetzt.

Was kann hier falsch sein?

(Mit anderen Worten, NSFetchedResultsChangeDelete kann aufgerufen werden, wenn das Objekt noch im Kontext vorhanden ist, aber nicht zum Prädikat passt?)

    
Natan R. 04.02.2013, 16:09
quelle

3 Antworten

1

Natürlich changeUpdate und nicht changeDelete . Sie haben nur einen Wert aktualisiert und nicht den gesamten Artikel gelöscht. Wenn Sie den Artikel aus Ihrer Datenbank löschen, ruft er changeDelete auf. Und es wird nach dem neuen init nicht angezeigt, weil Ihre Tabelle auf diesem Attribut basiert.

Sie müssen auf NSFetchedResultsChangeUpdate warten und prüfen, ob das Attribut wasDeleted geändert wurde. Wenn dies der Fall ist, aktualisieren Sie Ihre Tabellenansicht auf Ihre Bedürfnisse, z. lösche die spezifische Zeile.

    
user207616 07.02.2013 14:26
quelle
1

Ich mache dasselbe in meiner App und habe festgestellt, dass der -controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:newIndexPath Delegierte zuerst mit einem Änderungstyp NSFetchedResultsChangeDelete aufgerufen wird, gefolgt von einem zweiten Aufruf mit dem Änderungstyp NSFetchedResultsChangeUpdate .

Das NSFetchedResultsChangeUpdate könnte ein erwartetes Verhalten sein, aber was nicht erklärt wurde, ist warum der erste Aufruf mit NSFetchedResultsChangeDelete fehlt. Können Sie bestätigen, dass Sie diesen Fall korrekt behandeln?

    
chris 10.02.2013 12:48
quelle
1

Ich hatte genau das Problem .

Verwenden Sie nicht wasDeleted als Ihren Eigenschaftsnamen. Sie sollten keine Variationen von deleted verwenden, wenn Sie mit Ihren CoreData-Objekten arbeiten.

Ich habe meine Eigenschaft in hidden umbenannt und diese für das Prädikat verwendet. Alles hat so funktioniert, wie man es erwarten würde.

    
Daniel Amitay 13.02.2013 07:00
quelle