KVOのコールバックをセレクタで登録する

またまた随分と時間が空いてしまったが、一応続きの話。

このように便利なKVOだが、今ひとつ使いにくい部分もある。 その辺は次回にでも。

KVO監視は便利なのだが、NSKeyValueObserving簡易プロトコルに準拠した以下のメッセージに応答できるようにクラスを実装する必要がある。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
                        change:(NSDictionary *)change context:(void *)context

これはこれで良いと思うのだが、使う側としては固定のメソッドではなく、都度実行させたいセレクタ(SEL)を渡すことでコードの柔軟性が高まると思うのだ。
例えば、同プロトコルのaddObserver:メソッドの派生で、以下のようなシグネチャを持つ実装があれば便利だろう。

- (void)addObserver:(id)observer 
            forKeyPath:(NSString *)keyPath 
              selector:(SEL)selector 
              userInfo:(id)userInfo 
               options:(NSKeyValueObservingOptions)options;

使う場合は以下のように書く。

id dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"foo", @"key", nil];
[dict addObserver:self forKeyPath:@"key"
             selector:@selector(observeValueForFooKey:) //セレクタ登録
             userInfo:@"userInfo"
              options:NSKeyValueObservingOptionNew];

//通知用メソッド
- (void)observeValueForFooKey
{
    NSLog(@"%s: changed dictionary!!", __func__);
}

これならセレクタさえ取れればどんなメソッドでも登録してコールバックできる(と思う)。
問題は、パラメタが必要なセレクタをどう処理するかだが、それは追々考えるとしよう。