objective-c - 核心数据 : Observing changes in related entities

标签 objective-c ios core-data key-value-observing

我有一个示例托管对象模型,如下图所示。我想要发生的是:当作为 Bar 对象中货币关系值的对象发生更改时,自动将同一对象设置为通过 Bar 相关的所有 Foos 中的货币关系foos关系。

enter image description here

我理解这可以通过 KVO 完成吗?我倾向于首先将其添加到 Foo.m:

+ (NSSet *)keyPathsForValuesAffectingCurrency {
    return [NSSet setWithObject:@"bar.currency"];
}

但我不知道这是否正确或我将如何进一步进行。感谢您的任何建议。

最佳答案

您想要完成的事情当然是可能的,KVO 可以解决这个问题。您只需要实现几件事。

1。注册观察影响您属性(property)的关键

您可以在您的对象处于唤醒状态时将您的对象添加为观察者。

- (void) awakeFromInsert {
  [super awakeFromInsert];
  [self addObserver:self forKeyPath:@"bar.currency" options:NSKeyValueObservingOptionNew context:nil];
}

// Repeat for awakeFromFetch

请注意,这在这种情况下有效,因为这是一对一的关系。

2。触发通知时执行操作

当触发 bar.currency 通知时更新 currency 的值

- (void) observeValueForKeyPath:(NSString *)keyPath
                       ofObject:(id)object
                         change:(NSDictionary *)change
                        context:(void *)context
{
  if( [keyPath isEqualToString:@"bar.currency"] ) {
    [self setValue:[self valueForKeyPath:@"bar.currency"] forKey:@"currency"];
  }

  // The rest of your KVO logic ...
}

替代方法

正如您所指出的,这也可以通过实现依赖键来完成

+ (NSSet *)keyPathsForValuesAffectingCurrency {
  return [NSSet setWithObject:@"bar.currency"];
}

在这种情况下,您必须遵守 @"currency"。在您的 observeValue... 方法中,您必须改为检查此键。最后,您必须使用 setPrimitiveValue:forKey 而不是 setValue:forKey: 来设置值。这是因为后者会引起新的通知并导致死循环。

关于objective-c - 核心数据 : Observing changes in related entities,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6173534/

相关文章:

ios - NSMergeConflict(两个线程) - 设置合并策略无法解决

iphone - 对某些文本字段/ TextView 使用特殊的 iPad/iPhone 自动完成字典?

ios - 委托(delegate)回调方法返回变量慢,这会导致变量 nil 从另一个类访问时?

iphone - 使用 Core Data 插入对象数组的内存高效方法

ios - 应用程序在完成处理程序中崩溃并出现 EXC_BAD_ACCESS 错误

ios - 如何在 Xcode 中显示照片库图像?

objective-c - 想知道如何在算术运算中处理 nsnumber 对象

objective-c - 类型之间而不是变量之间的插入符,用括号括起来

ios - 当多个警报 View 出现在同一个 View Controller 中时,有没有办法错开?

ios - iOS 版 Google Analytics 中的线程崩溃