2009-07-09 12 views
19

NSMutableDictionaryの異なるキーの下に保存された値の変更を確認(購読)できますか?私の場合、サブスクリプションが開始されたときにキーはすでに存在していますが、値が変更され、この場合に通知を受けたいと思います。通知の変更された値のキーが欲しいです。NSMutableDictionaryの変更を観察する

私の辞書のキーがすべてのNSStringインスタンスであった場合、私は各キーパスに個別にサブスクライブできると仮定します。しかし、私の鍵が非文字列の場合はどうなりますか?その場合、私は運が悪いですか?

答えて

6

これは興味深い考えです。私は有望に見えるNSDictionaryまたはNSDictionaryControllerで何も見つけることができません。私の最初の本能は、NSMutableDictionaryの周りのコンポジションを使用して、setObject:forKey:(そしておそらく-removeObjectForKey :)の呼び出しを傍受して、加入者に変更を通知することです。

NSMutableDictionaryのサブクラス化にはCocoa With Love postがあります。このルートは、そのルートを選択すると便利な場合があります。私もcreated my own NSMutableDictionary subclassesを持っています。オープンソースコードを使用しても構いません。

監視する必要がある特定のキーを指定できるオブザーバープロトコルを設計できます。あまりにも多くのコードではありませんが、私は今のところ捨てる時間があります。

+0

ありがとうございました。私は、NSMutableDictionaryの周りの構成が行く方法だと思う。私はまだキーがNSStringsでない限り、その作業を行う方法を見ることができませんが、私はおそらくそれで動作すると思います。 –

+0

@Quinn Taylor:あなたのカスタムサブクラスへのリンクが死んでいるように見えます。このコードをチェックする必要があります。まだどこかにぶら下がっていますか? – Cyrille

6

NSMutableDictionaryの周りの構図を使ってこれを実装しました。私は少しのコードがどれぐらいか驚いた。私が実装したクラスはボードであり、ボードゲームでモデルを表現するために使用されています。誰でもaddObserver呼び出すことにより、ボード状態の変化を購読することができます:メソッドを、このように実装:あなただけKVOモデルを使用して、キーを購読することができますので、私はだまさ

- (void)addObserver:(id)observer { 
    for (id key in grid) 
     [self addObserver:observer 
       forKeyPath:[key description] 
        options:0 
        context:key]; 
} 

とキーの説明に加入キー自体をコンテキストとして渡します。私のボードのインスタンスを観察するオブジェクトでは、-observeValueForKeyPath:ofObject:change:context:を実装してkeyPath文字列を無視し、渡されたコンテキストを使用します。

私の単純なボードクラスは、このメソッドを使用して作成した人工物件に対してKVOに準拠していないため、をoptionsプロパティに渡したため、KVOマシンはこれらのキーの古い値または新しい値を取得しようとしません。それは私のコードを爆破させる原因になります。ボードを変更

何か(私の単純なクラスでこれを行う唯一の方法がある)KVO機械が行動に飛躍させるために必要な通知を上げる:

- (void)setPiece:(id)piece atLocation:(Location*)loc { 
    [self willChangeValueForKey:[loc description]]; 
    [grid setObject:piece forKey:loc]; 
    [self didChangeValueForKey:[loc description]]; 
} 

出来上がり! NSMutableDictionaryを非文字列キーで購読する!

+0

説明を購読することは素晴らしいトリックです! –

関連する問題