0

コア データに関する私の理解では、プリミティブ アクセサーが機能するために必要なのは、プロパティ名の @dynamic ディレクティブだけです (エンティティ実装内でそのプロパティのプリミティブ アクセサーを宣言することも同様です)。

何らかの理由で、生成されたプリミティブ アクセサーを使用すると、setState: メソッドは状態プロパティを変更しません。

- (int)state 
{
    NSNumber * tmpValue;

    [self willAccessValueForKey:@"state"];
    tmpValue = [self primitiveState];
    [self didAccessValueForKey:@"state"];

    return [tmpValue intValue];
}

- (void)setState:(int)value 
{
    [self willChangeValueForKey:@"state"];
    [self setPrimitiveState:[NSNumber numberWithInt:value]];
    [self didChangeValueForKey:@"state"];
}

key-value-coding バージョンを使用すると、状態プロパティが変更されます

- (int)state 
{
    NSNumber * tmpValue;

    [self willAccessValueForKey:@"state"];
    tmpValue = [self primitiveValueForKey:@"state"];
    [self didAccessValueForKey:@"state"];

    return [tmpValue intValue];
}

- (void)setState:(int)value 
{
    [self willChangeValueForKey:@"state"];
    [self setPrimitiveValue:[NSNumber numberWithInt:value] forKey:@"state"];
    [self didChangeValueForKey:@"state"];
}

どちらの場合も、I プリミティブ アクセサーは次のように宣言されます (Apple の例とコード生成に従って):

@interface Post (CoreDataGeneratedPrimitiveAccessors)

- (NSNumber *)primitiveState;
- (void)setPrimitiveState:(NSNumber *)value;

@end

これがなぜなのか、私は少し途方に暮れています。どんな助けでも大歓迎です!

4

4 に答える 4

3

膨大な量の頭を悩ませ、デバッグし、いじり、推測して確認した結果、最終的に問題が何であるかを突き止めました。これらの属性をインスタンス変数として定義した場合、Core Data プリミティブ アクセサーは動的に生成されません。私はデバッグ目的でそれらを定義していました (GBD は ivar が定義されていないとプロパティの値を認識できないようです)。これにより、プリミティブ アクセサーが正しく生成されませんでした。これは、Apple が実際に何らかの形で文書化する必要があるものです。自分で発見するのは非常に難しいからです。これが同じ問題を抱えている他の人に役立つことを願っています!

于 2011-01-21T04:25:00.750 に答える
1

私はこれを調べてきましたが、発見されたものの1つは、ドキュメントとは異なり、データモデルから生成された実装ファイルにプリミティブ動的アクセサーがリストされていないことです。他の場所では、自分で追加する必要があると述べています。それが問題でしょうか?

于 2011-02-01T23:38:58.377 に答える
0

私は同じ問題を抱えており、あなたのコメントに基づいてsetPrimitiveValueとprimitiveValueForKeyに切り替える必要があると言いたかったのです。デフォルトの実装が機能しないのが気になります。私の場合、別の NSManagedObject をサブクラス化していることに注意してください。それがあなたの場合でもあるかどうかはわかりません。

于 2011-01-13T17:56:14.127 に答える
0

NSManagedObjectXcode によって生成されたコードを使用または変更していますか? デフォルトでは、これらは#if 0ディレクティブによって「コメント化」されて生成されると思います。

于 2010-12-20T10:53:38.910 に答える