5

バックグラウンド

かなり優れたmogeneratorを使用して、コア データ アクセサーを自動生成しています。

mogenerator は、次のようにクラスを構成します。

NSManagedObject
    _JGTrainingBase
        JGTrainingBase
            _JGTrainingGroup 
                JGTrainingGroup
  • アンダースコアで始まるクラスは、mogenerator によってコア データ アクセサーで生成されたマシンです。

  • アンダースコアのないクラスは人間が編集できるクラスであるため、そこにカスタム メソッドを配置でき、データ モデルを変更して mogenerator を再実行しても上書きされません。

  • トレーニング グループ エンティティには、「子」と呼ばれる対多の関係があります。

  • Core Data アクセサーを使用して関係を変更しています。

私が欲しいもの

子オブジェクトを追加する前に、期間 (一時的な属性) を更新したいと考えています。

問題

マイコード

@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. サブクラスから Core Data によって生成されたメソッドにアクセスするにはどうすればよいですか?

ノート

私は、primitiveValueForKey: などを使用して子オブジェクトをセットに追加できることを認識していますが、それはコア データ アクセサーを書き直していることを意味し、時間を浪費し、おそらくコードにバグがあります。Apple の方法は、私が書いたどの方法よりも優れていると信じています。

ここで何が起こっているのかを理解するのに役立つ情報をありがとう。

4

1 に答える 1

3

親クラスが動的プロパティを実装し、そのサブクラス (NSManagedObject の孫) がプロパティのメソッドをオーバーライドする NSManagedObject の 2 つのサブクラスがある場合、それらのオーバーライドは super を呼び出すことができません。

ADCは言う

これらのアクセサーはランタイムによってオンデマンドで生成されるため、スーパーを呼び出すことはできません

于 2010-11-08T19:54:04.243 に答える