8

我有一个核心数据实体“bid”,它与许多“items”有关系,称为“itemLink”。在一对多关系中观察依赖键

在IB中,我有一个绑定到“total”的文本字段,这几乎可以工作。

在 “bid.m” 我有:

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

我也有:

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

} 

添加或删除的项目, “总” 更新按预期。但是,如果更改itemLink集合中的“项目”,则总数不会刷新。如何让KVO查看链接的NSSet中的相关对象何时发生变化?

感谢

回答

7

它看起来你的问题是与事实keyPathsForValuesAffectingTotal只提到的keyPath“itemLink”做。

由于这是一对多关系的路径,因此您可以有效地告诉您的出价对象观察一组变更。所有这些都是管理对象是否是它的成员。因此,这解释了为什么当您从“itemLink”添加或删除项目时获得更新,但仅此。

您不仅对哪些项目是该集合的成员感兴趣,还对这些成员的(可变)属性感兴趣 - 在这种情况下为价格。因此,除上述之外,您还希望“itemLink”的每位成员在所有观察员通知相关投标对象的“总计”键时,“价格”每当它发生变化时都会发生变化。

不幸的是,它不像在您的Bid类中将“itemLink.price”添加为依赖关键路径那么简单,因为KVO不允许您观察“通过”多对多关系。

如果您为Item实体的实例使用NSManagedObject子类,则可以手动添加此功能。在您的Item类中重写+ automaticallyNotifiesObserversForKey:以告诉Cocoa您将手动管理“价格”键的KVO通知,然后实施您自己的setPrice:发送适当通知的方法。这样的事情:

- (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"]; 
}