gpt4 book ai didi

iphone - 检测 NSManagedObject 特定属性的更改

转载 作者:行者123 更新时间:2023-12-03 18:18:04 25 4
gpt4 key购买 nike

如何检测 NSManagedObject 特定属性的更改?在我的 Core Data 数据模型中,我有一个代表待售产品的 Product 实体。 Product 实体有几个属性:priceskuweightnumberInStock、每当 Productprice 属性发生变化时,我都需要执行冗长的计算。因此,我想知道 any Productprice 属性何时发生变化,[编辑],即使该变化来自合并保存在另一个线程上的上下文。这样做的好方法是什么?我的商店中有数千个 Product 对象;显然向每个人发送一条 addObserver 消息是不可行的。

我一直在使用 NSManagedObjectContextObjectsDidChangeNotification 来检测更改,但它仅通知我托管对象已更改,而不是哪个该对象的属性对象发生了变化。每当 Product 发生任何更改时,我都可以重做计算,但是每当不相关的属性发生更改时,这都会导致无用的重新计算。我正在考虑创建一个 Price 实体(仅包含 price 属性)并在 Product 之间使用一对一关系价格。这样,我可以检测 Price 对象的更改,以便开始计算。这对我来说似乎过于笨拙。有更好的办法吗?

更新:

@railwayparade 指出我可以使用 NSManagedObjectchangedValues 方法来确定每个更新的对象的哪些属性已更改。我完全错过了这个方法,如果没有在后台线程上进行更改并合并到主线程的上下文中,它将完全解决我的问题。 (参见下一段。)

我完全错过了 NSManagedObjectContextObjectsDidChangeNotification 工作方式的微妙之处。据我所知,当保存在另一个线程上的托管对象上下文合并到主线程上的上下文时(使用 mergeChangesFromContextDidSaveNotification:),生成的 NSManagedObjectContextObjectsDidChangeNotification < em>only包含有关当前位于主线程的托管对象上下文中的对象的更改信息。如果更改的对象不在主线程的上下文中,则它不会成为通知的一部分。这是有道理的,但不是我所期待的。因此,我使用一对一关系而不是属性来获取更详细的更改信息的想法实际上需要检查后台线程的 NSManagedObjectContextDidSaveNotification,而不是主线程的 NSManagedObjectContextObjectsDidChangeNotification >。当然,正如 @railwayparade 所指出的那样,简单地使用 NSManagedObjectchangedValues 方法会更聪明。但是,我仍然面临一个问题,即主线程上合并的更改通知不一定包含后台线程上所做的所有更改。

最佳答案

关于此主题的一点,

The NSManagedObjectContextObjectsDidChangeNotification generated by Core Data indicates that a managed object has changed, but doesn't indicate which attribute has changed.

确实如此。 “changedValues”方法可用于查询哪些属性发生了变化。

类似于,

 if([updatedObjects containsKindOfClass:[Config class]]){
//if the config.timeInterval changed
NSManagedObject *obj = [updatedObjects anyObject];
NSDictionary *dict=[obj changedValues];
NSLog(@"%@",dict);
if([dict objectForKey:@"timeInterval"]!=nil){
[self renderTimers];
}
}

关于iphone - 检测 NSManagedObject 特定属性的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3901207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com