核心数据:观察某种类型的新实体
Posted
技术标签:
【中文标题】核心数据:观察某种类型的新实体【英文标题】:Core Data: Observing new Entity of certain type 【发布时间】:2011-09-01 21:57:32 【问题描述】:我希望在添加(并且可能更改/删除)某种类型的实体时收到通知。
我读到可以通过向 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
【问题讨论】:
【参考方案1】:首先,不要混淆实体和对象。实体是类似于类的抽象,它们永远不会添加到托管对象上下文中或从托管对象上下文中删除。添加到托管对象上下文或从托管对象上下文中删除的是托管对象。每个托管对象都以数据模型中的实体为键,就像任何其他对象实例以特定类为键一样。
因此,您真正想要的是在插入/更新/删除键控到特定实体的托管对象时收到通知。
处理这个问题的最简单方法是注册上下文的:
NSManagedObjectContextObjectsDidChangeNotification
...每当上下文中的托管对象被插入/更新/删除时,它将提供通知。要仅查找键控到特定实体的托管对象,请检查由 NSInsertedObjectsKey、NSUpdatedObjectsKey 和 NSDeletedObjectsKey 键返回的对象,然后检查每个对象的 entity
属性。
或者,您可以使用自定义 NSManagedObject 子类并覆盖 awakeFromInsert
以在首次插入对象时发出通知。
我会注意到很少需要这样的功能。当您发现自己连接了大量通知时,通常表明您的数据模型需要重新设计以捕获更多信息。你通常需要通知,因为数据模型的一些关键逻辑没有在 Core Data 中编码,而是驻留在需要通知的外部对象中。
【讨论】:
谢谢!这成功了。对于任何寻找特定代码的人:[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(some method) name:NSManagedObjectContextObjectsDidChangeNotification object:context];
【参考方案2】:
我选择了这种方法,感觉更干净:
创建基于实体的NSArrayController
(使用Interface Builder 编写更少的代码)
观察阵列控制器的arrangedObjects
键路径
完成。
【讨论】:
以上是关于核心数据:观察某种类型的新实体的主要内容,如果未能解决你的问题,请参考以下文章
观察 NSArrayController 变化:检测插入或删除