От примера Apple у меня есть это:
Event *event = (Event*)[NSEntityDescription
insertNewObjectForEntityForName:@"Event"
inManagedObjectContext:self.managedObjectContext];
Event
наследовался NSManagedObject
. Есть ли способ избежать этого странного вызова к NSEntityDescription и вместо этого просто alloc+init
так или иначе непосредственно Event
класс? Я должен был бы записать свой собственный инициализатор, который просто делает тот материал выше? Или NSManagedObject
уже достаточно интеллектуальный, чтобы сделать это?
NSM ManagedObject
предоставляет метод под названием initWithEntity:insertIntoManagedObjectContext:
. Вы можете использовать его для более традиционной пары allocation
/init
. Помните, что возвращаемый объект является а не автореализованным.
Чтобы заставить его работать правильно, есть много вещей. -insertnewobject: ... - это безусловно, самый простой способ, странно или нет. Документация говорит:
Управляемый объект отличается от других объекты тремя основными способами управляемыми Объект ... существует в окружающей среде Определяется его управляемым контекстом объекта ... Поэтому есть много работы Для создания нового управляемого объекта и правильно интегрировать его в Основная инфраструктура данных ... вы обескуражен от переопределения initwithentity: instribintomageDobjectContext:
, который сказал, что вы все равно можете сделать (читать дальше вниз по странице, к которой я связался), но ваша цель кажется «проще» или «меньше странно». Я бы сказал, что метод, который вы чувствуете, странно на самом деле самый простой, самый нормальный способ.
Я нашел окончательный ответ в 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]];
Разве категории не велики?
.