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

Posted

技术标签:

【中文标题】KVO:如何告诉观察者,那个自我改变了?【英文标题】:KVO: How to tell observer, that self changed? 【发布时间】:2012-05-29 00:28:07 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

设置托管对象的属性时,使用属性的访问器方法之一(例如,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 专家能仔细查看我的答案并确保我没有做错任何事情或遗漏任何内容,我将不胜感激。)

【讨论】:

我不确定这是否与我正在寻找的内容有关。我的属性确实正确发布了通知。 arrayController 正在观察我的 managedObject 本身。我想要的是我的 managedObject 发布它本身发生了变化,只要它的一个属性发生变化。 @bijan:根据定义,KVO 需要一个键和一个值;键命名一个属性,当该属性的值发生变化时,观察者会收到通知。如果您的对象可以先天更改,而更改不一定通过对象的属性之一可见,则该对象是一个值对象,例如字符串或图像,并且您的观察者应该观察保存该值对象的另一个对象的属性。

以上是关于KVO:如何告诉观察者,那个自我改变了?的主要内容,如果未能解决你的问题,请参考以下文章

KVO-理解与简单使用

KVO 使用及原理

[crash详解与防护] KVO crash

深入理解 KVCKVO 实现机制 — KVO

Rx 键值观察KVO的使用

iOS KVO 键值观察