11

Apple のドキュメント-setPrimitiveValue:forKey:は、対多関係を管理するために使用する場合、2 つの点であいまいです。

最初に彼らは次のように述べています:

対多関係を新しい NSMutableSet オブジェクトに設定しようとすると、(最終的には) 失敗します。

最終的?!それは一体何の意味ですか?後で失敗し-[NSManagedObjectContext save:]ますか? 管理対象オブジェクトがフォルトになり、ページインされたときは? いつ?オンデマンドで一貫して障害を再現するテスト ケースを作成できますか?

次に、このケースを正しく処理するためのサンプル コードを提供すると、次のように書かれています。

最初に既存のセットを取得しますprimitiveValueForKey:(メソッドが返されないことを確認してくださいnil

メソッドがnil を返す場合はどうすればよいですか? assert()オブジェクトグラフ全体が破損し、保存するとデータが失われるため、すぐに失敗しますか? NSAssert()発信者への警告としてそれをオンにしますが、押し続けます(黙って何もしません)?

今のところNS[Mutable]Set、その場合は次のように直接直接割り当てています。

- (void)setChildren:(NSSet*)value_ {
    NSMutableSet *mutableRelationshipSet = [[[self primitiveValueForKey:@"children"] mutableCopy] autorelease];
    if (mutableRelationshipSet) {
        [mutableRelationshipSet setSet:value_];
        [self setPrimitiveValue:mutableRelationshipSet forKey:@"children"];
    } else {
        [self setPrimitiveValue:value_ forKey:@"children"];
    }
}

それは間違っていますか?

4

1 に答える 1

6

の戻り値を-primitiveValueForKey:変更可能なセットとして変更するだけで、その戻り値が正しいことを行うと信頼できます。

また、操作の前後にも必ず使用-willChangeValueForKey:withSetMutation:usingObjects:してください。-didChangeValueForKey:withSetMutation:usingObjects:上記のコードではこれを示していません。

- (void)setChildren:(NSSet *)value {
    [self willChangeValueForKey:@"children" withSetMutation:NSKeyValueSetSetMutation usingObjects:value];

    NSMutableSet *primitiveValue = [self primitiveValueForKey:@"children"];

    [primitiveValue setSet:value];

    [self didChangeValueForKey:@"children" withSetMutation:NSKeyValueSetSetMutation usingObjects:value];
}

Leopard をターゲットにできる場合は、これについて心配する必要はありません。代わりに Core Data の組み込みプロパティ サポートを使用できます。

#import <CoreData/CoreData.h>

@interface Folder : NSManagedObject
@property (readwrite, retain) NSSet *children;
@end

@implementation Folder
@dynamic children;
@end

Core Data は、プロパティの getter/setter ペアだけでchildrenなく、変更可能な set アクセサーも生成するため、その上で使用-mutableSetValueForKey:して、最小限のオーバーヘッドで結果を操作できます。

于 2008-09-27T21:48:24.367 に答える