【问题标题】: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

【问题讨论】:

    标签: core-data nsmanagedobject nsmanagedobjectcontext nsnotifications


    【解决方案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 键路径
    • 完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多