我有一个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函数,但不知道该怎么做。
有人可以告诉我基于相同实体类型的现有NSManagedObject初始化NSManagedObject属性的正确方法,在同一个数组中,其值取决于现有对象的值吗?
答案 0 :(得分:1)
嗯,一种方法是对特定值进行提取。这只返回一个字典,我很确定它不会触发与获取错误或对象相关的所有通知。你应该能够只提取你想要的一个日期,而不会产生所有的花里胡哨。但是,在这种特殊情况下,我从未测试过。
另一种方法是直接创建托管对象,就像非托管对象一样,根据需要填充属性,然后将托管对象插入上下文。不是很优雅,但它会工作,它不会引发一堆通知。
一些Core Data手为其NSManagedObject子类编写自己的插入类方法。你可能想在这里使用它。 E.g。
+(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];
}