Почему я не могу назвать Core Data Accessors на супер? - PullRequest
5 голосов
/ 08 ноября 2010

Фон

Я использую довольно превосходный mogenerator для автоматической генерации моих основных средств доступа к данным.

mogenerator структурирует классы следующим образом:

NSManagedObject
    _JGTrainingBase
        JGTrainingBase
            _JGTrainingGroup 
                JGTrainingGroup
  • Классы, начинающиеся с подчеркивания, генерируются машиной с основными средствами доступа к данным с помощью mogenerator.

  • Классы без подчеркивания являются редактируемыми людьми, поэтому вы можете добавлять туда собственные методы и не перезаписывать их при изменении модели данных и повторном запуске mogenerator.

  • Сущность учебной группы имеет отношение ко многим, называемое "дети".

  • Я использую средства доступа к данным Core для изменения моих отношений.

Что я хочу

Я хочу обновить длительность - переходный атрибут - перед добавлением дочернего объекта.

Проблема

Мой код

@implementation JGTrainingGroup
...
-(void)addChildrenObject:(JGTrainingGroup *)value_ {
    [self updateDuration];
    [super addChildrenObject:value_];
}
...
@end

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

[JGTrainingGroup addChildrenObject:]: unrecognized selector sent to instance 0x10667fa30

Сгенерированный код

@interface _JGTrainingBase : NSManagedObject {}
// Method declarations
@end

@interface _JGTrainingBase (CoreDataGeneratedAccessors)
- (void)addChildrenObject:(JGTrainingBase*)value_;
- (void)removeChildrenObject:(JGTrainingBase*)value_;
// Lots more methods
@end

Вопросы

  1. Почему super не отвечает на метод addChildrenObject:? Это как-то связано с тем, что они добавляются в стиле категории?

  2. Как получить доступ к сгенерированному методу Базовых данных из подкласса?

Примечание

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

Спасибо за любой вклад, помогающий мне понять, что здесь происходит.

1 Ответ

3 голосов
/ 08 ноября 2010

Если у вас есть два подкласса NSManagedObject, где родительский класс реализует динамическое свойство, а его подкласс (внук NSManagedObject) переопределяет методы для свойства, эти переопределения не могут вызвать super.

говорит АЦП

Вы не можете вызвать super, так как эти методы доступа генерируются по требованию во время выполнения

...