观察一对多关系中的依赖键
Posted
技术标签:
【中文标题】观察一对多关系中的依赖键【英文标题】:Observing dependent keys across a to-many relationship 【发布时间】:2011-06-01 01:44:22 【问题描述】:我有一个核心数据实体“bid”,它与许多“item”有关系,称为“itemLink”。
在 IB 中,我有一个绑定到“总计”的文本字段,并且几乎可以正常工作。
在“bid.m”中我有:
- (NSDecimalNumber *)total
return [self valueForKeyPath:@"itemLink.@sum.price"];
我也有:
+ (NSSet *)keyPathsForValuesAffectingTotal
return [NSSet setWithObjects:@"itemLink", nil];
添加或删除项目时,“total”会按预期更新。但是,如果您更改 itemLink 集中的“项目”,则总数不会刷新。你如何让 KVO 看到链接的 NSSet 中的相关对象何时发生了变化?
谢谢
【问题讨论】:
【参考方案1】:看来您的问题与 keyPathsForValuesAffectingTotal
仅提及 keyPath“itemLink”这一事实有关。
由于这是一对多关系的路径,因此您实际上是在告诉您的出价对象观察一组变化。集合所做的只是管理对象是否是它的成员。这就解释了为什么在“itemLink”中添加或删除项目时您会收到更新,但仅此而已。
您不仅对哪些项目是集合的成员感兴趣,您还对这些成员的(可变)属性感兴趣——在这种情况下为价格。因此,除了上述内容之外,您还希望“itemLink”的每个成员通知相关投标对象的“total”键的所有观察者“price”在任何时候发生变化。
不幸的是,这并不像在您的 Bid 类中添加“itemLink.price”作为依赖键路径那么简单,因为 KVO 不允许您观察“通过”对多的关系。
如果您对 Item 实体的实例使用 NSManagedObject 子类,则可以手动添加此功能。在您的 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"];
【讨论】:
【参考方案2】:我编写了一些代码来支持跨多对关系的依赖键。
https://github.com/macoun/DerivedDependency
它还支持计算值的缓存。
【讨论】:
以上是关于观察一对多关系中的依赖键的主要内容,如果未能解决你的问题,请参考以下文章
MyBatis的对象关系映射---一对多等值连接策略★★★★★