2011-06-19 16 views
7

プレーンなクラスにはNSMutableSetプロパティがあります。オブジェクトがセットに追加されたり、セットから削除されたりするときはいつでも、カスタムコードを実行したい。私はクラスにいくつかのaddObjectToSet:のようなメソッドを書くことができることを知っていますが、セット上に直接KVOを持つもっと洗練されたソリューションがあるのだろうかと思っていました。キー値NSMutableSetの参照

NSSetは、オブザーバを追加しようとすると例外が発生します。驚くことではないが、おそらく名前付きのkeyPathは観察されないからだ。 The documentationは例外に関するかなり明確ですが、私は提案し、回避策理解していない:セットは、関連するオブジェクトの集合であるため、順不同対多の関係を観察し、代わりにセットを観察する

を。

これは何を意味するのでしょうか?そして、どのような回避策が見えるでしょうか?

+1

いくつかの関連する議論は、次のリンクで見つけることができますhttp://stackoverflow.com/questions/1610422/kvo-on-an-nscountedset –

答えて

6

「のセットが含まれているクラスにオブザーバを追加し、セット自体にオブザーバを追加しない」というのがかなり密な方法です:

[myObjWithASetAsIvar addObserver:self 
         forKeyPath:@"nameOfIvarHoldingTheSet" 
         options:NSKeyValueObservingOptionNew 
         context:nil]; 

1つのトリッキーなビットは、あなたが必要だということです適切な通知が送信されるように、すべてのアクセスをセットにラップします。セットを含むクラスで:

[self willChangeValueForKey:@"nameOfIvarHoldingTheSet"]; 
// Do something with the set 
[self didChangeValueForKey:@"nameOfIvarHoldingTheSet"]; 

を特異的にセットするための2つの通知方法もある:willChangeValueForKey:withSetMutation:usingObjects:didChangeValueForKey:withSetMutation:usingObjects:は、一般的な「価値の変化」の方法よりも効果的です。

私はあなたの最初の段落で言及した解決策とGirishにリンクされている質問のoutlined by Peter Hoseyがおそらく最善の方法だと信じています。 NSSet(および、推論や暗示によって、NSMutableSet)に、Appleのドキュメントから

+0

偉大な、私はついに理解した:)私は行って書いたKVOについてもう少し詳しく知っています。ありがとうジョシュ&ギリシャ! – epologee

1

NSSetオブジェクトは観察できないので、NSSetオブジェクトで呼び出されたときに、このメソッドは例外 を発生させます。集合を観察する代わりに、 の集合は集合であり、関連するオブジェクトの集合 であることがわかります。

私はこのかかわらず、言及する必要が、あなたは答えが、(あなたはNSSetにaddObserverを使用できると想定という点で)あなたの最初のアプローチには欠陥たという事実を発見したように見える嬉しいです。

0

あなたが例にそれを関連付けるとき、それは実際にはかなり明らかだ:

あなたがアカウントのNSSetを持つクラスの銀行を持っている場合は、アカウントにオブザーバを追加し、Bank.accountsにオブザーバを追加しないでください。銀行