Core Data Context „dirty“: MOC speichern Abstürze App
-
19-09-2019 - |
Frage
ziemlich neu in iPhone dev. Meine App nutzt Core Data, und an einem Punkt Ich versuche, einige Daten während einer NSFetchedResultsControllerDelegate Methode zu speichern:
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {
Ich bin am meisten von diesem direkt aus der Apple-Dokumentation zu diesem Thema zu bekommen. Die Löschaktion sieht so aus:
case NSFetchedResultsChangeDelete:
[managedObjectContext deleteObject:anObject];
NSError *error;
if (![managedObjectContext save:&error]) {
NSLog(@"WTF? %@", [error description]);
}
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
Nun, wenn ich dies tut, wird das betreffende Objekt nach dem unvermeidlichen Absturz gelöscht werden. So etwas richtig geschieht. Der Absturz ist interessant, aber:
Schwerwiegende Fehler in der Anwendung. Fehler beim Prozess anstehender Änderungen vor speichern: Ausnahme wurde während des Core Data Änderungsverarbeitung gefangen. Der Kontext ist noch schmutzig nach 100 Versuchen. Typischerweise wird dieses rekursive Verschmutzen durch eine schlechte Validierungsmethode, -willSave oder Benachrichtigungshandhabungsvorrichtung verursacht. mit userinfo (null)
2010-02-09 23: 02: 03,931 app2 [26664: 207] *** Terminating app aufgrund nicht abgefangene Ausnahme 'NSInternalInconsistencyException' Grund: ‚Fehler bei Prozessänderungen anhängigen speichern. Der Kontext ist noch schmutzig nach 100 Versuchen. Typischerweise diese rekursive Verschmutzen durch eine schlechte Validierungsmethode verursacht wird, -willSave oder Benachrichtigungs-Handler. "
Meine Forschung hat einige sehr begrenzte Ergebnisse aufgedreht - gute Sache, die ich hier habe, dies zu dokumentieren, wie? :-) Aber mein Bauch sagt, dass der MOC in meinem Controller an anderer Stelle geschrieben wird, obwohl ich keine Beweise, dass das passiert finden. Die viewDidLoad Methode hat die NSFetchedResultsController verwendet werden, um die Ausgangsdaten zu bekommen, aber das ist es.
Haben Sie Vorschläge, was könnte hier falsch sein? Wie üblich, Ihr Community-basierte hive mind sehr geschätzt!
Cheers, Aaron
Lösung
(Wenn ich das Problem richtig verstanden hat) Ich denke, dass alles, was Sie in diesem Fall tun müssen, ist:
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
Beachten Sie, dass die Methode
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
wird nach den zugrunde liegenden Daten gemeldet hat sich geändert. Also ich Ihr Objekt glauben bereits gelöscht wird, müssen Sie nicht manuell löschen. Alles, was in diesem Verfahren getan werden muss, ist es aus dem Tableview entfernen.
Hope, das hilft!