7

プレーンクラスには、NSMutableSetプロパティがあります。オブジェクトがセットに追加またはセットから削除されるたびに、カスタムコードを実行したいと思います。クラスにいくつかのようなメソッドを書くことができることは知っていaddObjectToSet:ますが、セットに直接KVOを使用したよりエレガントなソリューションがあるかどうか疑問に思いました。

結局のところ、NSSetにオブザーバーを追加しようとすると、NSSetは例外を発生させます。当然のことながら、観察する名前付きのkeyPathはおそらくないでしょう。ドキュメントは例外についてかなり明確ですが、私は提案された回避策を理解していません:

セットを観察する代わりに、セットが関連オブジェクトのコレクションである順序付けられていない対多の関係を観察します。

誰かがこれが何を意味するのかを繰り返すことができますか?そして、回避策はどのようになりますか?

4

3 に答える 3

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 がリンクした質問でPeter Hosey によって概説された解決策は、おそらく最善の方法だと思います。

于 2011-06-19T18:18:39.687 に答える
1

NSSet に関する Apple のドキュメント (および、推論と暗示により、NSMutableSet) から:

NSSet オブジェクトは監視できないため、このメソッドを NSSet オブジェクトで呼び出すと例外が発生します。セットを観察する代わりに、セットが関連オブジェクトのコレクションである順序付けられていない対多の関係を観察します。

答えが見つかったようでうれしいですが、最初のアプローチに欠陥があったという事実 (NSSet で addObserver を使用できると想定していたという点で) に関係なく、これについて言及する必要がありました。

于 2016-03-15T02:22:26.283 に答える