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

App*_*ter 8 cocoa core-data objective-c key-value-observing cocoa-bindings

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

在IB中,我有一个文本字段绑定到"总计",这几乎可以工作.

在"bid.m"我有:

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

我也有:

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

}
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Chr*_*eux 7

看起来你的问题与keyPathsForValuesAffectingTotal仅提到keyPath"itemLink" 的事实有关.

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

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

不幸的是,它并不像在Bid类中添加"itemLink.price"作为依赖关键路径那么简单,因为KVO不允许您观察"通过"到多对的关系.

如果对Item实体的实例使用NSManagedObject子类,则可以手动添加此功能.+ automaticallyNotifiesObserversForKey:在您的Item类中重写以告诉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"];
}
Run Code Online (Sandbox Code Playgroud)