NSManagedObject的自定义初始值设定项

时间:2012-05-07 21:43:48

标签: objective-c ios cocoa core-data nsmanagedobject

根据文件:

  

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

你应该使用awakeFromInsert或awakeFromFetch。

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

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

我打算如何解决这个问题?

1 个答案:

答案 0 :(得分: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];