如何根据现有的 NSManagedObject 值在 NSManagedObject 派生类中设置默认值?
Posted
技术标签:
【中文标题】如何根据现有的 NSManagedObject 值在 NSManagedObject 派生类中设置默认值?【英文标题】:How can I set a default value in NSManagedObject derived class based on existing NSManagedObject values? 【发布时间】:2011-03-08 18:18:44 【问题描述】:我有一个 NSManagedObject 派生类 OrderMO,它有一个 NSDate 类型的属性 OrderDate。我希望 OrderDate 的默认值是该月的第一个星期一,第一个月还没有与之关联的订单。
为此,我将覆盖 NSManagedObject 的 awakeFromInsert 函数并像这样设置 OrderDate 的值:
- (void) awakeFromInsert
[super awakeFromInsert];
[self setValue:[self getNextOrderDate] forKey:@"OrderDate"];
自定义函数 getNextOrderDate 计算适当的日期并返回它。问题是 getNextOrderDate 调用 executeFetchRequest 在 awakeFromInsert 调用期间显然是一个禁忌。我试过做this article 中描述的事情,但它并没有解决我的问题。在那篇文章中,通过调用 self performSelector 以延迟对 executeFetchRequest 的调用,直到 NSManagedObject 初始化之后,问题得以解决。就我而言,我只得到 2 个垃圾行。
我考虑对我的 Orders ArrayController 进行子类化以覆盖 add 函数,但也不知道该在那里做什么。
谁能告诉我基于现有的相同实体类型的 NSManagedObjects 初始化 NSManagedObject 属性的正确方法,在同一个数组中,其值取决于现有对象的值?
【问题讨论】:
【参考方案1】:嗯,一种方法是获取特定值。它只返回一个字典,我很确定它不会触发与获取错误或对象相关的所有通知。您应该能够只提取您想要的一个日期,而不会引发所有的花里胡哨。但是,我从未在这种特殊情况下测试过。
另一种方法是直接创建托管对象,即就像非托管对象一样,根据需要填充属性,然后才将托管对象插入上下文中。不是很优雅,但它会起作用,并且不会引发一堆通知。
一些Core Data 为他们的NSManagedObject 子类编写了他们自己的插入类方法。你可能想在这里使用它。例如
+(OrderMO *) insertOrderMOIntoManagedObjectContext:(NSManagedObjectContext *) aContext
OrderMO *newOrder=[[OrderMO alloc] init];
// pefrom fetch on aContext to find the next order date
newOrder.orderDate=//... fetched order date
[aContext insertObject:newOrder];
【讨论】:
以上是关于如何根据现有的 NSManagedObject 值在 NSManagedObject 派生类中设置默认值?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Core Data 中制作 NSManagedObject 的深拷贝