观察一对多关系中的依赖键

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的对象关系映射---一对多等值连接策略★★★★★

MyBatis的对象关系映射---一对多N+1策略★★★★★

Java观察者模式:轻松实现对象间的一对多依赖

如何为事实表创建一对多关系

使用SQL Server创建一对多关系

Nhibernate一对多关系复合键问题