Почему Core Data создает NSManagedObject со свойствами, но без сопутствующей переменной экземпляра?

Как говорится в заголовке, почему Core Data создает экземпляры NSManagedObject со свойствами для каждого атрибута объекта, но без сопутствующей переменной экземпляра? Проблема в том, что я хотел бы использовать некоторые из моих «сущностей» в типичном стиле alloc/init в некоторых частях моего кода. Не использовать выборку/контекст Core Data для создания/сохранения.

Я полагаю, что мог бы остаться без переменных экземпляра, но не повредит ли их добавление? Могу ли я также изменить @dynamic на @synthesize, чтобы использовать KVC для своих свойств/параметров?

Возможно, я совершенно ошибаюсь, пытаясь использовать одну из моих сущностей Core Data в некоторых частях моего кода без использования основных API-интерфейсов данных. Все еще довольно ново для этого, чтобы понять, когда я могу пойти своим путем.


person Coocoo4Cocoa    schedule 04.08.2009    source источник


Ответы (2)


Причина, по которой он не использует ивары, заключается в том, что этих данных там нет. Когда вы загружаете объект, он может ошибаться не во всех своих данных. ivars - это просто переменные, если вы и записываете их, NSManagedObject не имеет возможности ошибиться в значении, если оно еще не загружено. Через средства доступа NSManagedObject имеет узкую точку, которая позволяет ему считывать данные с диска, если он еще не был поврежден, что означает, что ваш граф объектов может быть введен лениво. В противном случае вам нужно будет ввести каждый подключенный объект.

Из-за этого вы не можете просто добавить ивары, они не будут иметь нужных вам значений. Точно так же вы не можете изменить @dynamic на @synthesized, все будет работать неправильно. Реализации динамических свойств, предоставляемые CoreData, в любом случае полностью совместимы с KVC и KVO.

Если вы хотите получить доступ к значениям без отключения KVO или KVC, вы можете получить доступ к «примитивным» значениям. Вы делаете это одним из двух способов. Вы используете примитивValueForKey: и setPrimitive:valueForKey: или можете просто объявить примитив и позволить CD предоставить динамические реализации (из документация)

@interface Department : NSManagedObject
{
}
@property(nonatomic, retain) NSString *name;
@end

@interface Department (PrimitiveAccessors)
- (NSString *)primitiveName;
- (void)setPrimitiveName:(NSString *)newName;
@end
person Louis Gerbarg    schedule 04.08.2009

Вам не нужны переменные экземпляра с Core Data. Управляемый объект хранит эти значения в другом месте.

Я никогда не заходил очень далеко с Core Data, но, если я правильно помню, вы должны использовать primitiveValueForKey: и setPrimitiveValue:forKey: для выполнения этих доступов из ваших методов доступа. (Помимо ваших методов доступа, вы должны использовать либо сами методы доступа, либо вместо них valueForKey:/setValue:forKey:.)

person Peter Hosey    schedule 04.08.2009