1

それ自体と 1 対 1 の関係を持つマネージド オブジェクトがあります。この例として、人物オブジェクトを他の人物にリンクして、結婚を表すことができます。

人物のプロパティの 1 つが住所で、それが 1 人の人物に対して変更された場合、どのように関係を追跡し、リンクされた人物オブジェクトに対して変更されたかを確認するにはどうすればよいでしょうか。

最初は、セッター、つまり setAddress でこれを行うことを考えていましたが、これが 2 つのオブジェクト間で無限の再帰を引き起こすことにすぐに気付きました。

このタイプの問題に対するエレガントな解決策は何ですか?

4

3 に答える 3

1

セッターでそれを行うこともできますが、宛先値がすでに設定したい値であるかどうかを確認し、無限ループなしでセッターから戻ります。

次のようなものを試すことができます

- (void)setAddress:(NSString *)address
{
    // common setter here

    // then set your relationship's address
    if (![self.personRelationship.address isEqual:address]) {
        self.personRelationship.address = address;
    }
}
于 2013-03-13T10:27:21.273 に答える
1

あなたの説明に基づいて、アドレスをAddressと関係のある別のエンティティに移動しますPerson。各人が 1 つのアドレスを持ち、各アドレスを複数の人が使用できるように関係を設定します。

これにより、アドレスを 1 か所で変更するだけで、そのアドレスを使用するすべての人に対してすぐに有効になります。同じ住所を持つ 2 人のユーザーが後で別の住所を持つ必要がある場合は、新しいAddressエンティティを作成します。

于 2013-03-13T16:29:23.170 に答える
1

1. ステップ

CoreData のセッターをオーバーライドする場合は、次のドキュメントに従ってください。

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods.html#//apple_ref/doc/uid/TP40002154-SW14

ここで重要なのは、例のように「プリミティブ」アクセサーを使用することです。

- (void)setAddress:(NSString *)newAddress
{
    [self willChangeValueForKey:@"address"];
    [self setPrimitiveAddress:newAddress];
    [self didChangeValueForKey:@"address"];
}

その後、属性を設定しようとする無限ループは発生しません。

2.ステップ

アドレスの質問に適用すると、パートナーのアドレスも設定できます。

コードは次のように変わります

- (void)setAddress:(NSString *)newAddress
{
    [self willChangeValueForKey:@"address"];
    [self setPrimitiveAddress:newAddress];
    [self didChangeValueForKey:@"address"];

    [self.partner willChangeValueForKey:@"address"];
    [self.partner setPrimitiveAddress:newAddress];
    [self.partner didChangeValueForKey:@"address"];
}

noa が提案する代替案:

- (void)setAddress:(NSString *)newAddress
{
    [self willChangeValueForKey:@"address"];
    [self setPrimitiveAddress:newAddress];
    if (![self.partner.address isEqual:newAddress])
        [self.partner setAddress:newAddress];
    [self didChangeValueForKey:@"address"];
}
于 2013-03-13T10:30:24.923 に答える