2010-10-21 11 views
6

J'ai parcouru les messages similaires à celui-ci mais aucun n'a répondu à mon problème.Méthodes de délégué NSFetchedResultsController ne pas déclencher après mergeChangesFromContextDidSaveNotification

Comme CoreDataBooks, j'utiliser un MOC séparé pour l'ajout et l'édition des articles et observer les notifications appropriées, comme ceci:

- (void)addControllerContextDidSave:(NSNotification*)saveNotification { 

    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; 
    // Merging changes causes the fetched results controller to update its results 
    [context mergeChangesFromContextDidSaveNotification:saveNotification]; 
    NSLog(@"merging changes in rootview"); 
} 

Quand je fais une sauvegarde, il est observé correctement. Le débogage de la notification montre le bon contexte, et le débogage du contexte montre l'élément ajouté juste. Le message de journal imprime également très bien. Mais rien ne se passe. Aucune des méthodes déléguées du NSFetchedResultsController ne se déclenche, et la vue de table n'est pas mise à jour.

Je n'ai pas essayé de mettre en cache ou de l'effacer. J'ai essayé reloadData sur la tableView, mais rien. Lorsque je quitte l'application et redémarre, il apparaît très bien.

MISE À JOUR: La notification ne contient en effet le bon contexte comme object, qui contient l'élément correct, mais le hachage userInfo n'a rien en elle:

userInfo = { 
    inserted = "{(\n)}"; 
    updated = "{(\n)}"; 
} 

il semble donc que la notification ne avoir des changements, malgré le contexte correct avec l'élément changé .... hmmmm.

Répondre

1

Et le prix pour une erreur stupide va trop ... Christoph !!

La raison pour laquelle la notification ne s'affichait pas était que j'avais oublié de faire une sauvegarde sur le MOC séparé avant d'appeler le délégué qui avait configuré la notification, puis de l'enregistrer à nouveau.

Étant donné que le MOC venait d'être enregistré, la seconde sauvegarde n'avait pas été modifiée et la notification était donc restée vide. Retrait de la première sauvegarde, comme j'aurais dû le faire beaucoup plus tôt, a résolu le problème.