相关疑难解决方法(0)

Core-Data中的自定义setter方法

我需要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的正确方法是什么?

setter core-data objective-c

68
推荐指数
4
解决办法
2万
查看次数

检测对NSManagedObject的特定属性的更改

如何检测对特定属性的更改NSManagedObject?在我的核心数据数据模型中,我有一个Product代表待售产品的实体.该Product实体有几个属性:price,sku,weight,numberInStock,等每当price一个属性Product的变化,我需要执行冗长的计算.因此,我想知道任何更改的price属性,[编辑]即使该更改来自合并另一个线程上保存的上下文.这样做的好方法是什么?我的商店里有成千上万的物品; 显然,向每个人发送一条消息是不可行的. ProductProductaddObserver

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

更新:

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

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

iphone notifications core-data nsmanagedobject

21
推荐指数
2
解决办法
2万
查看次数