如何检测对特定属性的更改NSManagedObject
?在我的核心数据数据模型中,我有一个Product
代表待售产品的实体。Product
实体有几个属性:price
, sku
, weight
,numberInStock
等。每当 a 的属性price
发生Product
变化时,我都需要进行冗长的计算。因此,我想知道任何更改的price
属性, [编辑]即使该更改来自合并保存在另一个线程上的上下文。这样做的好方法是什么?我的商店里有成千上万的物品;显然,向每个人发送一条消息是不可行的。 Product
Product
addObserver
我一直在使用NSManagedObjectContextObjectsDidChangeNotification
来检测更改,但它只通知我托管对象已更改,而不是该对象的哪个属性已更改。只要 a 有任何更改,我就可以重做计算Product
,但是只要不相关的属性发生更改,就会导致无用的重新计算。我正在考虑制作一个Price
实体(仅包含一个属性)并使用andprice
之间的一对一关系。这样,我可以检测到对象的变化以开始计算。这对我来说似乎过于笨拙。有没有更好的办法?Product
Price
Price
更新:
@railwayparade 指出我可以使用 的changedValues
方法NSManagedObject
来确定每个更新对象的哪些属性发生了变化。我完全错过了那个方法,如果没有在后台线程上进行更改并合并到主线程的上下文中,它将完全解决我的问题。(见下一段。)
我完全错过了NSManagedObjectContextObjectsDidChangeNotification
工作方式的一个微妙之处。据我所知,当保存在另一个线程上的托管对象上下文被合并到主线程上的上下文中时(使用 a mergeChangesFromContextDidSaveNotification:
),结果NSManagedObjectContextObjectsDidChangeNotification
仅包含有关当前在主线程的托管对象上下文中的对象的更改信息。如果更改的对象不在主线程的上下文中,则它不会成为通知的一部分。这是有道理的,但不是我所期待的。因此,我使用一对一关系而不是属性来获取更详细的更改信息的想法实际上需要检查后台线程的NSManagedObjectContextDidSaveNotification
,而不是主线程的NSManagedObjectContextObjectsDidChangeNotification
。当然,简单地使用以下changedValues
方法会更聪明NSManagedObject
正如@railwayparade 有用地指出的那样。但是,我仍然存在一个问题,即来自主线程合并的更改通知不一定包含在后台线程上所做的所有更改。