Question

Assez nouveau pour iPhone dev. Mon application utilise des données de base, et à un moment donné je tente de sauver des données au cours d'une méthode NSFetchedResultsControllerDelegate:

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

Je reçois le 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. Donc, quelque chose se passe à droite. L'accident est intéressant, bien que:

  

erreur d'application grave. Exception a été pris au cours du traitement du changement de base de données: Impossible de traiter les modifications en attente avant d'enregistrer. Le contexte est encore sale après 100 tentatives. En général, cette salissant récursive est causée par une mauvaise méthode de validation, -willSave ou gestionnaire de notification. avec userInfo (null)

     

2010-02-09 23: 02: 03,931 App2 [26664: 207] *** Mettre fin application en raison d'exception uncaught 'NSInternalInconsistencyException', la raison: « Impossible de traiter les modifications en attente avant d'enregistrer. Le contexte est encore sale après 100 tentatives. En général, cette salissant récursive est causée par une mauvaise méthode de validation, -willSave ou gestionnaire de notification ».

Ma recherche a tourné quelques résultats très limités - une bonne chose que j'ai ici pour documenter cela, hein? :-) Mais mon instinct dit que le MDC est écrit ailleurs dans mon contrôleur, mais je ne peux trouver aucune preuve que cela se produise. La méthode viewDidLoad a le NSFetchedResultsController utilisé pour obtenir les données initiales, mais c'est tout.

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

Cheers, Aaron

Était-ce utile?

La solution

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

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ée après que les données sous-jacente a changé. Je crois donc que votre objet a déjà été supprimé, vous n'avez pas besoin de le supprimer manuellement. Tout ce qui reste à faire dans cette méthode est le supprimer de la tableView.

Hope this helps!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top