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

Cocoa KVO:如何告诉观察家,自我改变了?,cocoa,core-data,key-value-observing,Cocoa,Core Data,Key Value Observing,在一个子类中,谁的实例被另一个对象观察到:如何告诉观察者这个实例已经改变了 我想做的是:当某个NSManagedObject(控制器管理)的属性发生更改时,我希望NSArrayController收到通知。控制器应该认为NSManagedObject已更改,但实际上它的一个属性已更改。设置托管对象的属性时,使用属性的访问器方法之一(例如,myObject.foo=bar或[myObject setFoo:bar])或使用KVC([myObject setValue:bar-forKey:@“fo

在一个子类中,谁的实例被另一个对象观察到:如何告诉观察者这个实例已经改变了


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

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

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

  • (仅限Ivars)在
    init
    方法中。您还不应该有任何观察者,所以您不应该担心发布KVO通知
  • (仅限Ivars)在
    dealloc
    中。您不应该再有任何观察者,因此您不应该担心发布KVO通知。(如果此时仍有观察者,这是代码中的一个bug。)
  • (IVAR和
    sPV:fK:
    )在自定义访问器中。您不需要从自定义访问器发布自己的KVO通知,因为KVO将为您完成这项工作。它还允许您设置依赖项,因此您也不需要为其他属性发布KVO通知

(我从未接触过核心数据,因此如果任何核心数据专家能够仔细查看我的答案,确保我没有弄错或遗漏任何内容,我将不胜感激。)

我不确定这是否与我所寻找的内容有关。我的属性确实正确地发布了通知。arrayController正在观察我的managedObject本身。我想要的是我的managedObject在它的一个属性发生更改时发布它自己的更改。@bijan:KVO,根据定义,需要一个键和一个值;该键命名一个属性,当该属性的值发生更改时,将通知观察者。如果您的对象可以天生改变,而改变不一定通过对象的某个属性可见,那么该对象就是一个值对象,就像字符串或图像一样,您的观察者应该观察持有该值对象的另一个对象的属性。