如何解决观察一对多关系中的从属键
| 我有一个核心数据实体\“ 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
它还支持对计算值进行缓存。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。