2011-05-29 3 views
2

Je me demande quand NSFetchedResultsChangeUpdate le type de changement dans la méthode controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: est passé?Lorsque le type de changement NSFetchedResultsChangeUpdate se produit?

J'ai créé NSFetchedResultsController avec sectionNameKeyPath non nul et demande d'extraction qui ont sortDescriptor. Ajout de quelques objets correspondant au prédicat de requête récupérée. Ensuite, j'ai essayé à la fois de changer la propriété de tri et la propriété sectionNameKeyPath de l'un de ces objets. En fait cela a bien fonctionné: l'objet changé s'est déplacé autour d'un tableView, MAIS chaque fois que j'ai reçu le type de changement NSFetchedResultsChangeMove! La modification d'autres accessoires (non utilisés pour le tri ou les sections) de cet objet n'a pas du tout déclenché controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:!

La raison pour laquelle je suis intéressé par NSFetchedResultsChangeUpdate est que je veux NSFetchedResultsController de me notifier lorsque certaines propriétés de l'objet déjà récupéré change dans les limites correspondant NSFetchedResultsController.fetchRequest.predicate. Par exemple, le prédicat met en correspondance l'objet de certaines entités avec prop == 1 OR prop == 2. Mais je veux aussi être informé quand un de ces objets appariés change prop valeur de 1 à 2.

Je ne veux pas créer deux NSFetchedResultsController s car je crois qu'il y a une manière plus élégante. + NSFetchedResultsChangeUpdate changer le type est le seul mystère encore inconnu pour moi sur NSFetchedResultsController - jamais attrapé.

Répondre

1

Je reçois cette valeur type lorsque je crée un deuxième contexte d'objet géré, que j'utilise le même magasin persistant, que je modifie la valeur d'un objet, puis que le contexte est enregistré dans le magasin persistant.

(Si je change le nom qu'il est triée, je reçois la valeur ChangeMove, comme vous le mentionnez.)

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

… 
     case NSFetchedResultsChangeUpdate: 
      [self configureCell:[tableView cellForRowAtIndexPath:indexPath] 
         inTable:tableView 
        atIndexPath:indexPath]; 
     break; 
… 

anObject = NSManagedObject sous-classe d'objet changé pertinents

indexPath = indice pertinent

newIndexPath = nil

(la raison pour laquelle je crée un second contexte est pour une variété de cas d'utilisation; un cas: "nouvel objet foo", les user fiddles créant une variété de relations, puis annule, je supprime le contexte, aucune gestion d'annulation nécessaire)

+2

NSFetchedResultsChangeUpdate se déclenche quand les entités * sont liées * aux entités gérées par un NSFetchedResultsController changement? Par exemple, disons que je crée des TVC qui affichent une entité parente, avec un nombre d'entités enfants basé sur une relation "à plusieurs". Que se passe-t-il si le nombre d'entités enfants change? Est-ce quelque chose que je devrais gérer seul? (Je devine oui.) –

+0

à partir des docs: Les modifications sont signalées avec les heuristiques suivantes: Lors des opérations d'ajout et de suppression, seul l'objet ajouté/supprimé est signalé. Il est supposé que tous les objets qui suivent l'objet affecté sont également déplacés, mais ces déplacements ne sont pas signalés. ... – bshirley

Questions connexes