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