我需要foo
在我的子类中为字段(我们称之为)编写自定义setter方法NSManagedObject
.foo
在数据模型中定义,Xcode分别自动生成@property
和@dynamic
.h和.m文件中的字段.
如果我像这样写我的二传手:
- (void)setFoo: (NSObject *)inFoo {
[super setFoo: inFoo];
[self updateStuff];
}
Run Code Online (Sandbox Code Playgroud)
然后我在调用时收到编译器警告super
.
或者,如果我这样做:
- (void)setFoo: (NSObject *)inFoo {
[super setValue: inFoo forKey: inFoo];
[self updateStuff];
}
Run Code Online (Sandbox Code Playgroud)
然后我最终陷入无限循环.
那么为NSManagedObject的子类编写自定义setter的正确方法是什么?
如何检测对特定属性的更改NSManagedObject
?在我的核心数据数据模型中,我有一个Product
代表待售产品的实体.该Product
实体有几个属性:price
,sku
,weight
,numberInStock
,等每当price
一个属性Product
的变化,我需要执行冗长的计算.因此,我想知道任何更改的price
属性,[编辑]即使该更改来自合并另一个线程上保存的上下文.这样做的好方法是什么?我的商店里有成千上万的物品; 显然,向每个人发送一条消息是不可行的. Product
Product
addObserver
我一直用NSManagedObjectContextObjectsDidChangeNotification
检测的变化,但它只是通知我是一个管理对象发生了变化,而不是其该对象的属性发生变化.每当a发生任何变化时,我都可以重做计算Product
,但只要不相关的属性发生变化,就会导致无用的重新计算.我正在考虑创建一个Price
实体(只包含一个price
属性)并使用Product
和之间的一对一关系Price
.这样,我可以检测到Price
对象的更改,以便开始计算.这对我来说似乎过于愚蠢.有没有更好的办法?
更新:
@railwayparade指出我可以使用该changedValues
方法NSManagedObject
确定每个更新对象的哪些属性已更改.我完全错过了这个方法,如果没有在后台线程上进行更改并将其合并到主线程的上下文中,它将完全解决我的问题.(见下一段.)
我完全错过了关于NSManagedObjectContextObjectsDidChangeNotification
工作方式的微妙之处.据我所知,当另一个线程上保存的托管对象上下文合并到主线程上的上下文(使用a mergeChangesFromContextDidSaveNotification:
)时,结果NSManagedObjectContextObjectsDidChangeNotification
只包含有关当前位于主线程的托管对象上下文中的对象的更改信息.如果更改的对象不在主线程的上下文中,则它不会成为通知的一部分.这很有道理,但不是我所期待的.因此,为了获得更详细的更改信息,我想使用一对一关系而不是属性实际上需要检查后台线程NSManagedObjectContextDidSaveNotification
,而不是主线程NSManagedObjectContextObjectsDidChangeNotification
.当然,简单地使用changedValues
方法会更聪明NSManagedObject
正如@railwayparade帮助指出的那样.但是,我仍然存在这样的问题:主线程上合并的更改通知不一定包含后台线程上所做的所有更改.