7

NSManagedObject以下を使用してサブクラスを初期化しています。

- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues

もちろん、例外をスローする必要がある未定義のキーも故意に与えています。

だから、私は実装しました:

- (void)setValue:(id)value forUndefinedKey:(NSString *)key

キーが定義されていない場合は、正しいキーにマップします。

ただし、私の実装は呼び出されず、代わりにNSManagedObjectの実装が使用され、例外スローされます。

のサブクラス実装をsetValuesForKeysWithDictionary:使用できない動作 (またはバグ) はありますか?NSManagedObjectsetValue:forUndefinedKey:

要求に応じてコードを追加しますが、呼び出されない既存のメソッドを実装しているだけなので、それがどれほど役立つかわかりません:

文脈で:

- (Company*)companyWithDictionary:(NSDictionary*)values{

    Company* newCompany = (Company*)[NSEntityDescription insertNewObjectForEntityForName:@"Company" inManagedObjectContext:self];

    [newCompany setValuesForKeysWithDictionary:values];

    return newCompany;
}

Companyサブクラス (呼び出されない) :

- (void)setValue:(id)value forUndefinedKey:(NSString *)key{

    if([key isEqualToString:idKey]){

        [self setValue:value forKey:@"uniqueID"];

    }else if([key isEqualToString:descriptionKey]){

        [self setValue:value forKey:@"descriptionText"];

    }else if([key isEqualToString:timeUpdatedKey]){

        [self setValue:value forKey:@"dateUpdated"];

    }else{

        [super setValue:value forUndefinedKey:key];

    } 
}
4

3 に答える 3

3

これを妨げるNSManagedObjectに固有のものは間違いなくありません。私は自分が取り組んでいるアプリでまさにこれを行っています。コードをもっと投稿できますか?

また、1つの考えはsetValue:forUndefinedKey:、例外をスローしているのは確かですか?valueForUndefinedKey:管理対象オブジェクトの場合、物事を適切に機能させるために(ゲッター)も実装する必要があると確信しています。

于 2009-12-02T16:45:50.697 に答える
2

簡単な質問ですが、モデル内のエンティティに NSManagedObject サブクラスのクラス名を指定していますか?

また、管理対象オブジェクトを初期化しているとおっしゃいましたが、どうやって?適切な理由がない限り、ほとんどの場合 +[NSEntityDescription insertNewObjectForEntityForName: inManagedObjectContext:] を介して挿入する必要があります。

于 2009-12-02T16:47:17.537 に答える
1

CoreDataフレームワークのクイッククラスダンプは、NSManagedObjectもオーバーライドsetValuesForKeysWithDictionary:することを示しているため、おそらくパフォーマンス上の理由などで、そのメソッドのカスタマイズを確実に行っているようです。setValuesForKeysWithDictionary:混乱を避けるために、私はおそらく、同等の独自のメソッドを記述し、それを呼び出すでしょう。このようなもの:

- (void)mySetValuesForKeysWithDictionary:(NSDictionary*)dict
{
    for (NSString* key in dict)
        [self setValue:[dict objectForKey:key] forKey:key];
}
于 2009-12-02T18:39:47.833 に答える