8

J'ai une entité Core Data, "bid", qui a une relation avec plusieurs "items", appelée "itemLink". Dans IB, j'ai un champ de texte lié à "total", et cela fonctionne presque.Observation de clés dépendantes dans une relation to-many

Dans "bid.m" je:

- (NSDecimalNumber *)total 
{ 
    return [self valueForKeyPath:@"[email protected]"]; 
} 

J'ai aussi:

+ (NSSet *)keyPathsForValuesAffectingTotal { 
    return [NSSet setWithObjects:@"itemLink", nil]; 

} 

Lors de l'ajout ou la suppression d'un élément, les mises à jour "total" comme prévu. Mais si vous changez un "item" dans l'ensemble de itemLink, le total n'est pas actualisé. Comment obtenez-vous KVO pour voir quand un objet connexe dans le NSSet lié a changé?

Merci

Répondre

7

Il semble que votre problème est de faire avec le fait que keyPathsForValuesAffectingTotal ne mentionne que les KeyPath « itemLink ». Comme c'est le chemin d'une relation à plusieurs, vous demandez à votre objet d'enchère d'observer un ensemble de modifications. Tout ce que fait un ensemble est de savoir si les objets en sont membres ou non. Cela explique pourquoi vous obtenez des mises à jour lorsque des éléments sont ajoutés ou supprimés de "itemLink", mais seulement cela.

Vous n'êtes pas seulement intéressé par les articles qui sont membres de l'ensemble, vous êtes également intéressé par les propriétés (mutable) de ces membres - prix dans ce cas. Donc en plus de ce qui précède, vous voulez que chaque membre de "itemLink" informe tous les observateurs de la clé "totale" de l'objet d'enchère concerné que le "prix" a changé chaque fois qu'il change. Malheureusement, ce n'est pas aussi simple que d'ajouter "itemLink.price" en tant que keypath dépendant dans votre classe Bid, car KVO ne vous permet pas d'observer les relations 'through' to-many.

Si vous utilisez une sous-classe NSManagedObject pour les instances de votre entité Item, vous pouvez ajouter cette fonctionnalité manuellement. Remplacez + automaticallyNotifiesObserversForKey: dans votre classe Item pour indiquer à Cocoa que vous allez gérer les notifications KVO manuellement pour la clé "price", puis implémentez votre propre méthode setPrice: qui envoie la notification appropriée. Quelque chose comme ceci:

- (void)setPrice:(id)inPrice 
{ 
    // bid = inverse relationship of itemLink 
    [[self valueForKey:@"bid"] willChangeValueForKey:@"total"]; 
    [self willChangeValueForKey:@"price"]; 

    [self setPrimitiveValue:inPrice forKey:@"price"]; 

    [self didChangeValueForKey:@"price"]; 
    [[self valueForKey:@"bid"] didChangeValueForKey:@"total"]; 
} 
Questions connexes