2012-05-07 3 views
2

Согласно документации:Пользовательские инициализатор для NSManagedObject

Вы не должны переопределить инициализации. Вы обескуражены переопределение initWithEntity: insertIntoManagedObjectContext:

и вы должны использовать вместо awakeFromInsert или awakeFromFetch.

Это нормально, если все, что я хочу сделать, это установить какой-то атрибут текущей или подобной, но что, если я хочу отправить другой объект и установить атрибуты на основе его информации?

Например, в подклассе NSManagedObject, называемом «Item», мне нужна вещь initFromOtherThing: (Thing *), в которой имя элемента установлено на имя объекта. Я хотел бы избежать «просто помнить», чтобы каждый раз устанавливать имя сразу после создания элемента и обновлять пятнадцать различных классов контроллеров, когда я решаю, что я хочу, чтобы Item также установил другой атрибут по умолчанию на основе Thing. Это действия, привязанные к модели.

Как я должен справиться с этим?

ответ

1

Я думаю, что лучший способ справиться с этим - подклассифицировать NSManagedObject, а затем создать категорию для хранения того, что вы хотите добавить к объекту. Например, несколько методов класса для uniquing и удобно создавать:

+ (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]; 
Смежные вопросы