2010-02-10 1 views
1

Assez nouveau sur iPhone dev. Mon application utilise Core Data, et à un moment je tente de sauver des données au cours d'une méthode NSFetchedResultsControllerDelegate:Contexte de données de base "sale": MOC enregistrer l'application de plantages

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject 
    atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type 
    newIndexPath:(NSIndexPath *)newIndexPath { 

Je reçois plus de ce droit sur la documentation d'Apple sur le sujet. L'action de suppression ressemble à ceci:

case NSFetchedResultsChangeDelete: 
     [managedObjectContext deleteObject:anObject]; 
     NSError *error; 
     if (![managedObjectContext save:&error]) { 
      NSLog(@"WTF? %@", [error description]); 
     } 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
         withRowAnimation:UITableViewRowAnimationFade]; 
     break; 

Maintenant, quand je fais cela, l'objet en question sera supprimé après l'accident inévitable. Il se passe donc quelque chose de bien. L'accident est cependant intéressant:

Erreur d'application grave. Une exception a été détectée lors du traitement des modifications de base des données: échec du traitement des modifications en attente avant la sauvegarde. Le contexte est toujours sale après 100 tentatives. En règle générale, cette corruption récursive est provoquée par une méthode de validation incorrecte, -willSave ou un gestionnaire de notification. avec userInfo (null)

2010-02-09 23: 02: 03.931 app2 [26664: 207] *** Fin de l'application en raison d'une exception non interceptée 'NSInternalInconsistencyException', raison: 'Impossible de traiter les modifications en attente avant la sauvegarde. Le contexte est toujours sale après 100 tentatives. Généralement, cette saleté récursive est causée par une mauvaise méthode de validation, -willSave, ou un gestionnaire de notification.

Ma recherche a abouti à des résultats très limités - bonne chose que j'ai ici pour documenter ça, hein? :-) Mais mon instinct dit que le MOC est écrit ailleurs dans mon contrôleur, bien que je ne puisse trouver aucune preuve de ce qui se passe. La méthode viewDidLoad utilise NSFetchedResultsController pour obtenir les données initiales, mais c'est tout.

Des suggestions sur ce qui pourrait ne pas être ici? Comme d'habitude, votre esprit de ruche communautaire est très apprécié!

Cheers, Aaron

Répondre

3

(Si je comprends correctement le problème) Je pense que tout ce que vous devez faire dans ce cas est la suivante:

case NSFetchedResultsChangeDelete: 

     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
         withRowAnimation:UITableViewRowAnimationFade]; 
     break; 

Rappelez-vous que la méthode

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath 

est notifié après que les données sous-jacentes ont changé. Donc, je crois que votre objet est déjà supprimé, vous n'avez pas besoin de le supprimer manuellement. Tout ce qui reste à faire dans cette méthode est de le retirer de la tableView.

Espérons que cela aide!

+1

Merci à vous deux. Marcus, votre note au sujet de la méthode de délégué appelée à la suite de la sauvegarde de MOC l'a vraiment cristallisée pour moi. Je devrais aller acheter ton livre ou quelque chose ... :-) –

Questions connexes