1

在一个子类中,其实例被另一个对象观察到:如何告诉观察者这个实例发生了变化?

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

4

1 回答 1

3

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

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

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

(我从来没有接触过 Core Data,所以如果有任何 Core Data 专家可以仔细查看我的答案并确保我没有做错任何事情或遗漏任何内容,我将不胜感激。)

于 2012-05-29T02:35:22.297 回答