如何根据现有的 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 的深拷贝

segueing时出现核心数据错误:无法在NSManagedObject类上调用指定的初始值设定项

事后修改 Core Data 中现有的对象属性

CoreData NSManagedObject 已损坏

如何重新获取NSManagedContext中存在的对象

如何根据现有的 mongoose 查询检查单个文档?