【问题标题】:How can I set a default value in NSManagedObject derived class based on existing NSManagedObject values?如何根据现有的 NSManagedObject 值在 NSManagedObject 派生类中设置默认值?
【发布时间】: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 属性的正确方法,在同一个数组中,其值取决于现有对象的值?

【问题讨论】:

    标签: objective-c cocoa core-data


    【解决方案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];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 2011-09-12
      • 1970-01-01
      • 2020-10-30
      相关资源
      最近更新 更多