核心数据:观察某种类型的新实体

时间:2011-09-01 21:57:32

标签: core-data nsmanagedobject nsmanagedobjectcontext nsnotifications

每当添加某种类型的实体(并且可能更改/删除)时,我都会收到通知。

我可以通过向managedObjectContext添加一个观察者来阅读它。但是,我还没有找到实际的方法。

我在做:

[context addObserver:self forKeyPath:@"{myEntityName}" options:{I have tried several different values, but I am failing to understand which one to use} context:@"NewEntity"];

感谢您的帮助。

注意:我显然是coredata / cocoa / objective-c的新手,这可能是非常基本的,但一直在追逐答案。无法找到有关如何正确观察上下文对象更改的示例和/或解释(我已经能够观察到特定实体的更改而没有问题)。

顺便说一句:这是一个类似的问题,表明这是可能的,但我缺乏细节:Core Data: Observing all changes on Entity of certain type

2 个答案:

答案 0 :(得分:9)

首先,不要混淆实体和对象。实体是类似于类的抽象,它们永远不会添加到托管对象上下文或从托管对象上下文中删除。它是在托管对象上下文中添加或删除的托管对象。每个托管对象都键入数据模型中的实体,就像任何其他对象实例键入特定类一样。

因此,当您插入/更新/删除键入特定实体的托管对象时,您真正想要的是通知。

最简单的方法是注册上下文:

NSManagedObjectContextObjectsDidChangeNotification

...每当插入/更新/删除上下文中的托管对象时,它都会提供通知。要仅查找键入特定实体的托管对象,请检查NSInsertedObjectsKey,NSUpdatedObjectsKey和NSDeletedObjectsKey键返回的对象,然后检查每个对象的entity属性。

或者,您使用自定义NSManagedObject子类并覆盖awakeFromInsert以在首次插入对象时发出通知。

我会注意到很少需要这样的功能。当您发现自己连接大量通知时,通常表明您的数据模型需要重新加工才能捕获更多信息。您通常需要通知,因为数据模型的某些关键逻辑不是在Core Data中编码,而是驻留在需要通知的外部对象中。

答案 1 :(得分:0)

我选择这种方法,感觉更干净:

  • 创建基于实体的NSArrayController(使用Interface Builder编写更少的代码)
  • 观察阵列控制器的arrangedObjects密钥路径
  • 完成。