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

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

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

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

Ответы [ 2 ]

16 голосов
/ 04 августа 2009

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

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

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

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

@interface Department (PrimitiveAccessors)
- (NSString *)primitiveName;
- (void)setPrimitiveName:(NSString *)newName;
@end
3 голосов
/ 04 августа 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...