1

我想确定核心数据中的属性是否发生变化并更新我的 UI。该属性可能会因在 NSPrivateQueueConcurrencyType 类型的托管对象上下文中运行的后台提取而改变。

我添加了一个监听器:[myCoreDataEntity addObserver:self forKeyPath:myCoreDataAttribute options:NSKeyValueObservingOptionNew context:nil]

但该事件永远不会触发。知道为什么吗?对象在另一个上下文中被更改 - 这可能是原因吗?(当 save: 在父上下文中完成时,什么都不会触发)。

我可以使用手动 KVO,但由于对象尚未保存到父上下文,刷新 UI 不起作用,因为当对象在与 NSPrivateQueueConcurrencyType 关联的上下文中更改时,它指向 NSMainQueueConcurrencyType 中的上下文

4

2 回答 2

1

您没有收到通知是因为您观察到了错误的对象。在NSEntityDescription运行时从不改变。它代表了实体在数据模型中的定义方式。但是,使用实体描述的实例NSManagedObject可以并且确实在运行时发生变化。如果您想知道特定托管对象的属性是否发生变化,则需要观察该特定对象。

如果您需要在任何托管对象更改该属性的值时得到通知,您最好的选择是为该属性编写一个自定义设置器并在那里处理它。您可能还会发现NSManagedObjectContextObjectsDidChangeNotification它很有用,但它会在任何属性更改时触发。

于 2013-01-08T00:35:15.197 回答
0

假设myCoreDataEntity在您的示例中是托管对象,则问题在于建模属性1的自动外部更改通知 [由托管对象的核心数据禁用] :

NSManagedObject 为建模属性禁用自动键值观察 (KVO) 更改通知,并且原始访问器方法不调用访问和更改通知方法。对于未建模的属性,在 OS X v10.4 Core Data 上也禁用了自动 KVO;在 OS X v10.5 及更高版本上,Core Data 采用了 NSObject 的行为。

您可以为特定属性或托管对象子类或托管对象子类上的类别中的所有属性打开它们:

单一属性:

- (BOOL) automaticallyNotifiesObserversFoMyCoreDataAttribute {
    return YES;
}

所有属性(不推荐):

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)theKey {
    return YES;
}

它不发送自动更改通知的原因主要是性能。自动更改通知确实会增加一些开销,尽管在最近的硬件上它相当小,即使在处理数千个对象时也是如此。与往常一样,配置文件以查看适合您的方法。

于 2014-08-06T06:44:02.950 回答