2

根据文档:

您不应该覆盖 init。不鼓励您覆盖 initWithEntity:insertIntoManagedObjectContext:

您应该改用 awakeFromInsert 或 awakeFromFetch。

如果我想要做的只是将某个属性设置为当前日期或类似日期,这很好,但是如果我想发送另一个对象并根据其信息设置属性怎么办?

例如,在一个名为“Item”的 NSManagedObject 子类中,我想要一个 initFromOtherThing:(Thing *)thing,其中项目的名称设置为该事物的名称。我想避免“只需记住”每次在创建项目后立即设置名称,并且当我决定我希望 Item 还基于 Thing 设置另一个默认属性时必须更新十五个不同的控制器类。这些是与模型相关的操作。

我该怎么处理这个?

4

1 回答 1

1

我认为处理这个问题的最好方法是继承 NSManagedObject,然后创建一个类别来保存你想要添加到对象的内容。例如,一些用于唯一且方便地创建的类方法:

+ (item *) findItemRelatedToOtherThing: (Thing *) existingThing inManagedObjectContext *) context {
    item *foundItem = nil;
    // Do NSFetchRequest to see if this item already exists...
    return foundItem;
}

+ (item *) itemWithOtherThing: (Thing *) existingThing inContext: (NSManagedObjectContext *) context {
    item *theItem;
    if( !(theItem = [self findItemRelatedToOtherThing: existingThing inManagedObjectContext: context]) ) {
        NSLog( @"Creating a new item for Thing %@", existingThing );
        theItem = [NSEntityDescription insertNewObjectForEntityForName: @"item" inManagedObjectContext: context];
        theItem.whateverYouWant = existingThing.whateverItHas;
    }
    return theItem; 
}

现在永远不要initWithEntity:insertIntoManagedObjectContext:直接调用,只需使用您的便利类方法,例如:

item *newItem = [item itemWithOtherThing: oldThing inContext: currentContext];
于 2012-05-07T22:54:27.690 回答