iPhone - измените класс сущности (NSManagedObject), чтобы сделать их инициализируемыми - PullRequest
1 голос
/ 23 апреля 2010

Я хотел бы использовать свой собственный NSManagedObject как обычный объект (а также его обычные функции). Можно ли изменить класс, чтобы иметь возможность инициализировать его как обычный объект?

[[myManagedObject alloc] init];

Спасибо

edit: чтобы прояснить вопрос, все ли облажается, если я изменю @dynamic на @synthesize в реализации?

Ответы [ 2 ]

3 голосов
/ 24 апреля 2010

Я делаю это довольно часто в одном из моих приложений.Мой подход состоит в том, чтобы инициализировать объект с:

-(id)initWithEntity:(NSEntityDescription *)entity insertIntoManagedObjectContext:(NSManagedObjectContext *)context

передачей nil для контекста.Чтобы получить описание сущности, вам нужен доступ к managedObjectContext.Я склонен получать описание сущности при запуске моего приложения, а затем сохранять его в переменной экземпляра в моем делегате приложения.

Вот пример:

//inside my "Engine" class
self.tweetEntity = [NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:self.moc];

//later on when I want an NSManagedObject but not in a managed object context
Tweet *tweet = [[[Tweet alloc] initWithEntity:self.engine.tweetEntity insertIntoManagedObjectContext:nil] autorelease];

Это позволяет мне использовать NSManagedObjects безхранение их в базе данных.Позже, если я решу, что я хочу, чтобы объект был вставлен в мою базу данных, я могу сделать это, вставив его в контекст моего управляемого объекта:

[self.moc insertObject:tweet];
2 голосов
/ 23 апреля 2010

Контекст управляемого объекта является обязательным свойством NSManagedObject, поэтому вы не можете правильно инициализировать его экземпляр, не вставив его в контекст.Он смотрит на контекст, чтобы понять его сущность, и уведомляет контекст, когда изменяется любое из его свойств.

@dynamic и @synthesize - это просто директивы компилятора.Вы можете переключиться на @synthesize из @dynamic, если вы сами предоставляете правильные методы получения и установки.Поскольку NSManagedObject в значительной степени зависит от наблюдения значения ключа, вы должны написать средства доступа, совместимые с KVO.

Если вам нужно инициализировать подкласс NSManagedObject, вы переопределяете awakeFromInsert, что позволит вам настроить экземпляр при его создании.Вы также можете настроить объект каждый раз, когда он выбирается с помощью awakeFromFetch.

...