Я могу создать новый экземпляр своего пользовательского класса управляемых объектов, не проходя NSEntityDescription?

От примера Apple у меня есть это:

Event *event = (Event*)[NSEntityDescription 
    insertNewObjectForEntityForName:@"Event" 
             inManagedObjectContext:self.managedObjectContext];

Event наследовался NSManagedObject. Есть ли способ избежать этого странного вызова к NSEntityDescription и вместо этого просто alloc+init так или иначе непосредственно Event класс? Я должен был бы записать свой собственный инициализатор, который просто делает тот материал выше? Или NSManagedObject уже достаточно интеллектуальный, чтобы сделать это?

7
задан Jacob Relkin 25 January 2010 в 15:47
поделиться

3 ответа

NSM ManagedObject предоставляет метод под названием initWithEntity:insertIntoManagedObjectContext:. Вы можете использовать его для более традиционной пары allocation/init. Помните, что возвращаемый объект является а не автореализованным.

5
ответ дан 7 December 2019 в 01:21
поделиться

Чтобы заставить его работать правильно, есть много вещей. -insertnewobject: ... - это безусловно, самый простой способ, странно или нет. Документация говорит:

Управляемый объект отличается от других объекты тремя основными способами управляемыми Объект ... существует в окружающей среде Определяется его управляемым контекстом объекта ... Поэтому есть много работы Для создания нового управляемого объекта и правильно интегрировать его в Основная инфраструктура данных ... вы обескуражен от переопределения initwithentity: instribintomageDobjectContext:

, который сказал, что вы все равно можете сделать (читать дальше вниз по странице, к которой я связался), но ваша цель кажется «проще» или «меньше странно». Я бы сказал, что метод, который вы чувствуете, странно на самом деле самый простой, самый нормальный способ.

1
ответ дан 7 December 2019 в 01:21
поделиться

Я нашел окончательный ответ в More iPhone 3 Development Дейва Марка и Джеффа ЛеМарша.

Если вас действительно беспокоит, что для вставки нового объекта в NSManagedObjectContext используется метод на NSEntityDescrpiton, а не на NSManagedObjectContext, вы можете использовать категорию для добавления метода экземпляра в NSManagedObjectContext.

Создайте два новых текстовых файла с именами NSManagedObject-Insert.h и NSManagedObject-Insert.m.

В NSManagedObject-Insert.h поместите следующий код:

import <Cocoa/Cocoa.h>
@interface NSManagedObjectContext (insert)
- (NSManagedObject *)insertNewEntityWithName:(NSString *)name;
@end

В NSManagedObject-Insert.m поместите этот код:

#import "NSManagedObjectContext-insert.h"

@implementation NSManagedObjectContext (insert)
- (NSManagedObject *)insertNewEntityWithName:(NSString *)name
{
return [NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:self];
}
@end

Вы можете импортировать NSManagedObject-Insert.h в любое место, где вы хотите использовать этот новый метод. Затем замените вызовы insert в NSEntityDescription, как, например, этот:

NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

на более короткий и интуитивно понятный:

[context insertNewEntityWithName:[entity name]];

Разве категории не велики?

.
1
ответ дан 7 December 2019 в 01:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: