Как использовать атрибуты Core Data с типом безопасной структуры с mogenerator? - PullRequest
2 голосов
/ 16 февраля 2012

Для атрибутов структурных типов, которые может обрабатывать NSKeyValueCoding, я использую шаблон средства доступа к данным Core, описанный в документации Apple здесь .

Например, структура NSRange может быть указана в ядреМодель данных с типом Transformable, тогда для клиентов можно избежать ригматуры NSValue, предоставив методы доступа в подклассе NSManagedObject в форме:

Интерфейс:

@property(assign, nonatomic) NSRange range;

Реализация;

- (NSRange) range {

    [self willAccessValueForKey:@"range"];
    NSRange retVal = range;
    [self didAccessValueForKey:@"range"];

    return retVal;
}

- (void)setRange:(NSRange)aRange {

    [self willChangeValueForKey:@"range"];
    range = aRange;
    [self didChangeValueForKey:@"range"];
}

Однако сгенерированные подклассами Mогенератора NSManagedObject объявляют атрибуты Transformable как свойства NSObject, поэтому клиенты должны получать / устанавливать значения NSValues.

Как лучше всегосправиться с этой ситуацией с помощью mogenerator, в то время как (1) придерживаясь простого шаблона Transformable, а не путаясь с переходными вспомогательными атрибутами, и (2) избегая каких-либо правок «машинных» классов Menerator?

Ответы [ 5 ]

1 голос
/ 07 марта 2012

Окончательный способ справиться с этим будет, как scc предложил в ранее принятом ответе, изменить файлы шаблона mogenerator. Им нужно будет (а) изменить метод доступа трансформируемого атрибута на соответствующий тип (в данном случае NSRange), а затем (б) добавить средства доступа с соответствующими вызовами метода KVO.

Поскольку это больше, чем у меня есть время, чтобы выяснить, как это сделать, мой временный способ выглядит следующим образом:

  • добавьте ключ attributeValueClassName к атрибуту userInfo атрибута (в редакторе Core Data) со значением NSValue (просто для того, чтобы убедиться, что аксессоры генератора будут NSValue, а не NSObject).
  • в редактируемом человеком выводе mogenerator, добавьте средства доступа, подобные тем, о которых идет речь, за исключением нового имени (например, rangeValue и setRangeValue). Базовыми значениями по-прежнему будут сохраняемые значения NSValues, но мои средства доступа позаботятся о KVO и упаковке / распаковке.

Не идеально, но я получаю строго типизированные средства доступа без необходимости редактировать машинные файлы mogenerator.

0 голосов
/ 08 июня 2012

Вы читаете не ту часть документации. Пожалуйста, посмотрите здесь :

NSRange не нуждается в преобразовании. Существуют методы для всех этих базовых структур, таких как:

NSRangeFromString();
NSStringFromRange();

Таким образом, вы бы определили свойство тени как что-то вроде "rangeAsString" типа NSString.

В вашем подклассе MO вы будете следовать в документации о том, как правильно преобразовать и сохранить значение, чтобы основные данные знали, что ваш объект стал грязным, когда выполняете:

myObject.range = NSMakeRange(0,5);
0 голосов
/ 18 апреля 2012

Для тех, кто хочет редактировать файл шаблона машины, используйте следующий условный или специальный случай для преобразуемого атрибута NSRange.

<$if Attribute.hasTransformableAttributeType && Attribute.objectAttributeClassName == "NSRange" $>

Вот как я изменил заголовочный файл шаблона машины.https://gist.github.com/2414047

0 голосов
/ 27 февраля 2012

Можете ли вы изменить файлы шаблонов, которые использует mogenerator?(Я думаю), если вы избежите скалярных значений, вы можете безопасно использовать NSObject * вместо id.

0 голосов
/ 16 февраля 2012

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

Кстати, когда я запускаю генератор модели управляемых объектов после определения преобразуемого атрибута, я получаю не NSObject, а id. Нет предупреждений.

...