Добавление непостоянных переменных в nsmangedobject
У меня есть подкласс NSManagedObject, и я хотел бы добавить пару ivars для отслеживания некоторых книг. Я не хочу, чтобы эти vars сохранялись, и поэтому я не включаю их в состав модели данных.
У меня возникли проблемы с поиском правильного способа сделать это.
- Должен ли я просто создавать ivars в моем классе, создавать соответствующее свойство, а затем синтезировать их в реализации?
- Не следует ли создавать ivars, а вместо этого просто объявлять свойство, а затем @dynamic свойство в имплантации?
- Есть ли другой подход, который я должен принимать?
И должен ли я выполнять всю настройку в подклассе NSManagedObject, или мне нужно создать подкласс моего подкласса, так что, если я изменю свою модель данных, я не потеряю все свои настройки, когда получаю xcode для генерации мой подкласс NSManagedObject автоматически?
Спасибо!
Ответы
Ответ 1
Каждый атрибут для NSManagedObject
имеет флажок с именем переходный. Таким образом, у вас будут динамические аксессоры для объекта без фактического сохранения самого значения свойства. Посмотрите флажок прямо под текстовым полем для ввода имени атрибута.
![enter image description here]()
ОБНОВЛЕНИЕ. Если вы не хотите создавать перенос из-за новых атрибутов, создайте стандартные ivars
@interface MyMO : NSManagedObject {
NSString *_nonPersistentAttribute;
}
@property (nonatomic, retain) NSString *nonPersistentAttribute;
@end
@implementation MyMO
@synthesize nonPersistentAttribute=_nonPersistentAttribute;
@end
Ответ 2
В документации для NSManagedObject
имеется раздел "Пользовательские переменные экземпляра". В нем обсуждаются оба подхода.
Оба переходных, смоделированных атрибута и ивара - хорошие решения. Это зависит от вкуса и стиля.
Один очень важный пункт, чтобы помнить, если вы используете ivars: вам нужно очистить ivars в - (void)didTurnIntoFault
и установить любые начальные значения в - (void)awakeFromFetch
и - (void)awakeFromInsert
. Вам нужно не коснуться любых смоделированных атрибутов или отношений внутри -didTurnIntoFault
, иначе у вас появятся проблемы.
Ответ 3
Мудрый,
К вашему первому вопросу re: ivars, у вас есть два варианта стандартных ivars или переходных атрибутов на вашей сущности. Большая разница между ними заключается в том, что переходные атрибуты участвуют в аспектах изменения/грязности/отмены основных данных. Если ваши ивары не нуждаются в этом, тогда не используйте переходные атрибуты. (Да, используйте @property
и @synthesize
для ваших иваров.)
К вашему второму вопросу re: где внести изменения? Я немного луддит. Шаблоны заголовков, автоматически генерируемые Xcode, довольно просты. Следовательно, я использую автоматически созданные файлы в первый раз, когда я создаю сущность и редактирую в моих изменениях после этого. Честно говоря, вы не меняете свои структуры данных модели очень часто. Следовательно, добавление нескольких строк здесь и там к файлам .h &.m не является большой стоимостью. Существуют и другие механизмы. Система Moener Wolfch хорошо зарекомендовала себя и полезна. Тем не менее, я не уверен, что mogenerator решает проблему, с которой сталкиваются современные программисты Objective-C v2 Core Data. (Obj-C v2 упростил для программистов Core Data многое другое.)
Эндрю
Ответ 4
Вот удобный образец, который я использовал в прошлом:
Создайте категорию своего класса и поместите ее в дополнительный исходный файл, например ManagedObject+Support.h
. Помните, что в объявлении интерфейса вы используете только скобки:
@interface ManagedObject (Support)
// declare your variables and methods
@end
Таким образом, вы можете изменить ситуацию, не изменяя модель управляемых объектов. (Изменение MOM имеет много проблем с повторно заполненными базами данных, миграцией и т.д.). Когда вы меняете модель, вы можете снова сгенерировать файлы классов без потери кода в категории.