iOS プログラミング メモ KVOについて
さっき作った プロジェクト「SingletonTest」 を再利用して、KVO の実験をしてみた。
KVOというのは、Key Value Observing の略で、「オブジェクトの値の変化」を監視するための仕組み。
「Objective-C逆引きハンドブック」を読みながら実験してみた。
Amazon CAPTCHA
監視する側とされる側は、次のようにしてみる。
監視する側: ViewController クラスから作られるインスタンス
監視される側:AppDataクラスから作られるインスタンス
ソースをいじるのは、監視する側の ViewController.m だけ。
まず、監視するという設定をしてあげる。
今回は、viewDidLoadの中に、次の文言を追加した。
NSKeyValueObservingOptions options = (NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld); [appData addObserver:self forKeyPath:@"intB" options:options context:nil];
2行目の設定により、appDataというインスタンスの intB という値に変化があった場合に、このクラス(self)の然るべきメソッドを呼び出すように設定がされる。
そして、その「然るべきメソッド」とは、次のメソッド。これを ViewController.m の中の適当な場所に加える。
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { NSLog(@"***Observed"); NSLog(@"KeyPath = %@", keyPath); NSLog(@"change = %@",[change description]); }
このメソッドは、どんな変化があったのかを表示する機能しかない。
SecondViewController が生成した2番めの画面で、intBの値を変化させた時でも、この監視機能が生きていて、ちゃんとNSLogでメッセージが吐き出されることが確認できる。
必要な作業は、これだけ。
監視される側については、何もする必要がないというので、少し驚いた。
先のソースから、変更点はごく僅かなので、ソースのULは省きます。