问题描述
|
我有一个核心数据实体\“ bid \”,它与许多\“ item \”有关系,称为\“ itemLink \”。
在IB中,我有一个文本字段绑定到“总计”,并且几乎可以正常工作。
在“ bid.m”中,我有:
- (NSDecimalNumber *)total
{
return [self valueForKeyPath:@\"itemLink.@sum.price\"];
}
我也有:
+ (NSSet *)keypathsForValuesAffectingTotal {
return [NSSet setWithObjects:@\"itemLink\",nil];
}
添加或删除项目时,\“ total \”会按预期更新。但是,如果您在itemLink集中更改一个\“ item \”,则不会刷新总数。如何获取KVO来查看链接的NSSet中的相关对象何时发生了变化?
谢谢
解决方法
看来您的问题与
keyPathsForValuesAffectingTotal
仅提及keyPath \“ itemLink \”有关。
由于这是一对多关系的路径,因此您实际上是在告诉出价对象观察一组变化。集合所做的只是管理对象是否是其成员。因此,这说明了为什么在\“ itemLink \”中添加或删除项目时会得到更新,但仅此而已。
不过,您不仅对集合中的哪些项目感兴趣,还对这些成员的(可变)属性感兴趣-在这种情况下为价格。因此,除了上述内容之外,您还希望\“ itemLink \”的每个成员都将相关出价对象的\“ total \”键的所有通知者随时通知\“ price \”已更改。
不幸的是,这并不像在Bid类中添加“ itemLink.price”作为从属键路径那样简单,因为KVO不允许您观察“通过”多对多关系。
如果将NSManagedObject子类用于Item实体的实例,则可以手动添加此功能。在Item类中覆盖+ automaticallyNotifiesObserversForKey:
,以告知Cocoa您将要为\“ price \”键手动管理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\"];
}
, 我编写了一些代码来支持跨多关系的依赖键。
https://github.com/macoun/DerivedDependency
它还支持对计算值进行缓存。