KVO:如何告诉观察者,自我改变了?

时间:2012-05-29 00:28:07

标签: cocoa core-data key-value-observing

在子类中,其实例由另一个对象观察:如何告诉观察者该实例已更改?

我想要做的是:我希望NSArrayController在某些NSManagedObject(控制器管理)的属性发生更改时收到通知。控制器应该认为NSManagedObject已经改变,但实际上它的一个属性确实发生了。

1 个答案:

答案 0 :(得分:3)

设置托管对象的属性时,请使用属性的访问者方法之一(例如myObject.foo = bar[myObject setFoo:bar])或使用KVC([myObject setValue:bar forKey:@"foo"])。后者是普通NSManagedObject的唯一方法;能够做前者是子类化NSManagedObject的优势之一。

您可以自己发布KVO通知,但只有在您直接分配实例变量(或使用setPrimitiveValue:forKey:)时才需要这样做,除非在少数情况下您不应该这样做:

  • (仅限Ivars)在init方法中。您还不应该有任何观察员,因此您不必担心发布KVO通知。
  • (仅限Ivars)dealloc。你不应该有任何观察员,所以你不必担心发布KVO通知。 (如果此时仍然有观察者,那么代码中就是一个错误。)
  • (ivars和sPV:fK:)在自定义访问器中。您无需从自定义访问者发布自己的KVO通知,因为KVO会为您执行此操作。它还允许您设置依赖项,因此您也不需要为其他属性发布KVO通知。

(我从来没有进入核心数据,所以如果任何核心数据专家可以仔细查看我的答案并确保我没有弄错或留下任何东西,我会很感激。)