cocoa - KVO : How to tell observer, self 改变了?

标签 cocoa core-data key-value-observing

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

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

最佳答案

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

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

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

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

关于cocoa - KVO : How to tell observer, self 改变了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10791773/

相关文章:

iphone - 后台执行

swift - 即使刷新文本,NSTextView 链接仍保持 "baked"

iphone - Sybase ULtralite DB 和 iOS 核心数据

ios - 如何根据核心数据中的实体创建子类?

cocoa - 在 CoreData 对象上保存观察者的干净方法?

macos - 如何将 kFSEventStreamEventFlagEventIdsWrapped 与 FSEvents 一起使用?

objective-c - 使用 Transforms/Security.framework 的 RSA 加密 + Objective-C

ios - 如何在 Xcode 8 中使用 Swift 3 创建 managedObjectContext?

ios - 检测系统警报 View 何时出现/将关闭

ios - KVO 不适用于类别