【问题标题】: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 中的相关对象何时发生了变化?

谢谢

【问题讨论】:

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


    【解决方案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

      它还支持计算值的缓存。

      【讨论】:

        猜你喜欢
        • 2020-08-31
        • 1970-01-01
        • 2022-01-24
        • 2011-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-04
        • 2020-01-25
        相关资源
        最近更新 更多