2011-03-08 83 views
0

我有一个NSManagedObject派生类OrderMO具有NSDate类型的属性OrderDate。我希望OrderDate的默认值是没有订单关联的第一个月的第一个月的第一个星期一。如何根据现有NSManagedObject值在NSManagedObject派生类中设置默认值?

要做到这一点,我重写NSManagedObject的awakeFromInsert功能和设置订购日期的价值是这样的:

- (void) awakeFromInsert 
{ 
    [super awakeFromInsert]; 
    [self setValue:[self getNextOrderDate] forKey:@"OrderDate"]; 
} 

自定义功能getNextOrderDate计算适当的日期和返回。问题是getNextOrderDate调用了executeFetchRequest,这在awakeFromInsert调用期间显然是不允许的。我试过做this article中描述的内容,但它没有解决我的问题。在那篇文章中,通过调用self performSelector将对executeFetchRequest的调用延迟到NSManagedObject被初始化之后,问题就解决了。在我的情况下,我只得到2个垃圾行。

我认为我的订单ArrayController的子类重写添加函数,但真的不知道该怎么做。

有人可以告诉我正确的方式来初始化一个NSManagedObject属性基于同一个实体类型的现有NSManagedObjects,在同一个数组与值取决于现有对象的值?

回答

1

那么,一种方法是做一个特定值的提取。这只会返回一个字典,我很确定它不会触发与获取故障或对象相关的所有通知。你应该能够提取你想要的一个日期,而无需启动所有的花里胡哨。但是,我从来没有在这种特殊情况下进行过测试。

另一种方法是直接创建managedObject,就像非托管对象一样,根据需要填充属性,然后只将managedObject插入到上下文中。不是很优雅,但它会工作,它不会引发一堆通知。

某些核心数据手为其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]; 
}