在多对多关系中观察依赖键

时间:2011-06-01 01:44:22

标签: objective-c cocoa core-data cocoa-bindings key-value-observing

我有一个核心数据实体“bid”,它与许多“项目”有关系,称为“itemLink”。

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

在“bid.m”中我有:

- (NSDecimalNumber *)total
{
    return [self valueForKeyPath:@"itemLink.@sum.price"];
}

我也有:

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

}

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

由于

2 个答案:

答案 0 :(得分:7)

看起来您的问题与keyPathsForValuesAffectingTotal仅提到keyPath“itemLink”这一事实有关。

由于这是多对多关系的路径,因此您有效地告诉您的出价对象观察变更集。集合所做的就是管理对象是否是其成员。这就解释了为什么在“itemLink”中添加或删除项目时会获得更新,但仅限于此。

您不仅仅对哪些项目是该组成员感兴趣,您还对这些成员的(可变)属性感兴趣 - 在这种情况下价格。因此,除了上述内容之外,您还希望“itemLink”的每个成员通知所有观察者相关的投标对象的“总”关键字“价格”随时更改。

不幸的是,它并不像在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"];
}

答案 1 :(得分:1)

我写了一些代码来支持多对多关系中的依赖键。

https://github.com/macoun/DerivedDependency

它还支持缓存计算值。