5

Un problème de mise à jour de ma vue de table se produit lorsque je modifie par programmation une propriété d'objet géré existante. Je m'attendrais à ce que mon NSFetchedResultsControllerDelegate soit appelé dans un tel cas, mais ce n'est pas le cas.Données de base: la mise à jour d'un objet géré n'appelle pas NSFetchedResultsControllerDelegate

d'Apple doc dit:

Une instance de NSFetchedResultsController utilise des méthodes dans ce protocole d'aviser son délégué que les résultats aller chercher du contrôleur ont été modifiés en raison d'un ajout, de suppression, déplacer ou mise à jour opérations.

En plus de détails, mon objet géré comme une propriété int appelé status qui prend des valeurs d'une enum. Ma vue de table n'affiche que les objets dont le status est égal à upToDate (l'une des valeurs de l'énumération). Pour ce faire, mon FetchedResultController a un prédicat qui teste ce statut:

predicate = [NSPredicate predicateWithFormat:@"doc.status == %d", upToDate]; 

Il fonctionne très bien, mais les mises à jour ne sont pas répercutées lorsque je change un objet hors de la date de retour à l'état upToDate. Mon code est modifié à partir du modèle d'Apple.

Voici ce que j'ai essayé:

myObject.status = [NSNumber numberWithInt:upToDate]; 
[managedObjectContext save:nil]; 
[managedObjectContext processPendingChanges]; 
[myTableView reloadData]; 

Et enfin, je réussi à avoir mon point de vue la table mise à jour avec un appel à:

[fetchedResultsController performFetch:&error]; 
[myTableView reloadData]; 

Mais même alors, aucun de mes NSFetchedResultsControllerDelegate méthodes get appelé, en contradiction avec le document d'Apple. De plus, aucune animation fluide ne se produit. Je pensais que controllerWillChangeContent:, controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: et controllerDidChangeContent: étaient appelés.

Je suppose que j'ai manqué quelque chose, peut-être quelque chose d'évident, mais je ne vois pas quoi. Est-ce que performFetch: doit être appelée chaque fois qu'un objet géré change potentiellement? Quand est-ce que le NSFetchedResultsControllerDappelle vraiment son délégué?

Merci.

+0

Toutes les solutions que vous avez trouvées pour ce problème? Je fais face à des situations similaires où les rappels de mes délégués ne sont jamais déclenchés pour une opération de mise à jour. L'ajout de nouveaux objets ou la suppression d'objets existants appelle quand même la méthode déléguée. Quelle pourrait être la raison? –

Répondre

0

Si les méthodes déléguées FRC ne sont jamais appelées quel que soit le type de modification, l'explication la plus probable est que le délégué n'est pas correctement configuré. Il pourrait être causé par:

  1. Le délégué est simple pas défini
  2. La classe délégué ne déclare pas le protocole NSFetchedResultsControllerDelegate.
  3. Vous apportez les modifications dans un autre contexte sans fusionner.

Je suggère de capturer le retour d'erreur de l'opération de sauvegarde pour s'assurer que rien ne se passe avec la sauvegarde.

Le FRC doit être informé de toute modification de son contexte, qu'il ait été sauvegardé ou non. Le FRC devrait alors informer son délégué.

+1

1. 'aFetchedResultsController.delegate = self;' est présent 2. Double cochée. 3. Je n'ai qu'un seul contexte, transmis par le délégué de l'application. Comme je l'ai écrit, c'est essentiellement le code Apple vanille. Une autre idée quoi d'autre à vérifier? Et bien sûr, je capture l'erreur de sauvegarder. J'ai simplement simplifié mon extrait de code pour cette question. –

0

Je l'ai eu juste arriver avec un initWithFetchRequest: managedObjectContext: sectionNameKeyPath: cacheName: où ensuite sectionNameKeyPath est non-nul. Si je m'assure que sectionNameKeyPath est nul alors j'obtiens les mises à jour comme je m'y attendais.

J'étudie toujours pourquoi cela se produit