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

War es hilfreich?

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!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top