2010-07-04 5 views
0

J'ai une application qui stocke la structure arborescente dans CoreData. Il y a un ManagedObject, "Item", et il a des attributs:Remplir la propriété CoreData ManagedObject basée sur une autre propriété d'objet

  • itemId (string)
  • Liste item
  • titre (string)
  • parentId (string)
  • parent (relation Point de)
  • parentTitle (string)

points de ParentID à un autre objet Item.

Comment faire pour que la propriété parentTitle soit automatiquement renseignée avec le titre de l'élément parent?

Répondre

1

Alors que la suggestion de Martin est une bonne solution pour les valeurs dérivées, ma question sur la vôtre est, pourquoi voudriez-vous cela? Vous ne manipulez pas du tout la valeur du parent, jamais. Puisque vous êtes juste d'y accéder, accéder au parent directement via KVC tels que:

Item *item = ...; 
NSString *title = [item valueForKeyPath:@"parent.title"]; 
//Do something with title 

Le temps que vous souhaitez utiliser la fonctionnalité keyPathsForValues... est si vous changez quelque chose en fonction de cette valeur. Si vous y accédez, utilisez directement KVC.

1

C'est la possibilité d'obtenir la fonctionnalité souhaitée:

// implement in Item.m 
// manages KVO notifications 
+ (NSSet *)keyPathsForValuesAffectingParentTitle 
{ 
    return [NSSet setWithObjects:@"parent.title", nil]; 
} 

// getter for parentTitle 
- (NSString*) parentTitle 
{ 
    return [self valueForKeyPath:@"parent.title"]; 
} 

déclare en outre la propriété pour parentTitle en lecture seule dans Item.h Il n'y a pas besoin de déclarer un attribut de données de base « parentTitle ».

Le seul problème que je vois avec cette solution est la suivante:

  • Point A est parent de l'élément B
  • A se transforme en faute
  • B est toujours actif et un peu de vue est lié à B.parentTitle

la vue obtient une notification en raison de la dépendance déclarée avec keyPathsForValuesAffecting, objet encore a est déjà en défaut (et à l'arrêt ne peut être à nouveau unfaulted) d oes Core Data gérer tels défauts & problèmes d'observation automatiquement?

+0

Merci pour la solution! Est-ce une mauvaise pratique d'avoir une telle propriété parentTitle? Ne devrait-il pas être encouragé à toujours accéder à la valeur via parent.title? – Rod

+0

Je pense que Marcus a donné une bonne explication quand utiliser quelle solution. –

Questions connexes