blog.nambo.jp

Objective-CのKVO(キー値監視)の使い方

Objective-C(というかCocoa, Mac, iOS)のキー値監視(KVO, Key-Value Observing)の簡単な使い方です。

NSMutableDictionaryの特定のキーの値に変化があった時に通知する場合を考えます。

key1key2で構成されるdictionaryを作り、key1addObserver:self forKeyPath:@"key1"で監視対象に設定します。

通知のオプションは二つあり、
NSKeyValueObservingOptionNewは変更後の値を、
NSKeyValueObservingOptionOldは変更前の値を通知するオプションです。

1
2
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:@{@"key1":@"This is key1.", @"key2":@"This is key2."}];
[dict addObserver:self forKeyPath:@"key1" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

key1の値を変更してみます。

1
[dict setObject:@"Hello!" forKey:@"key1"];

すると、次のメソッドが呼ばれます。

1
2
3
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
  NSLog(@"%@", [change description]);
}

出力されるログは以下の通り。

1
2
3
4
5
{
  kind = 1;
  new = "Hello!";
  old = "This is key1.";
}

不要になったら通知の解除を忘れずに。

1
[dict removeObserver:self forKeyPath:@"key1"];

簡単ですね。