Notification(NSNotificationCenter)
NSNotificationCenter についてです。
とあるクラスが何かの処理をしたとき, ほかのクラスに何か処理をさせたい。
そんな場合, 単純なところではクラスにインスタンスを持たせそいつが実行するといったDelegationといった方法があります。
しかし, インスタンス保持といった関連性のない場合はどうでしょう。そういった場合でも処理がしたい場合があるでしょう。
シチュエーションとしては, Observerの処理をUIに反映させる。とか, 子のViewControllerの処理結果を親ViewControllerに伝えるといったところでしょうか?
こういった処理を請け負う方法としてNotification, とKVOがあります。今回はNotificationです。
基本的な考え方
まず, 受ける側と出す側を決めます。受ける側とは, ほかのクラスからNotificationを受け取り何かしらの処理をします。
使う方法は, 受けるNotification名と処理メソッドを登録することです。
次は出す側です。Notificationを出すタイミングで特定のNotification名をつけてpostします。
※受ける側のクラスごとに処理メソッドを作ることができるので, クラスが違えば1つのNoticationで違う処理が可能です。
NSNotificationCenter
受ける側
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc addObserver:self selector:@selector(start:) name:@"Start" object:nil];
この場合, StartというNotification名を登録して, そのNotificationを受け取った場合 startというメソッドを実行します。
メソッドを実装します。
-(void)start:(NSNotification *)notification { NSLog(@"Start"); }
出す側
[[NSNotificationCenter defaultCenter] postNotificationName:@"Start" object:nil];
データの受け渡し
データの受け渡しは, NSDictionaryを使います。 postNotificationName のところでuserinfoというプロパティがあるのでそこにいれます。
出す側
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value", @"key", nil]; [[NSNotificationCenter defaultCenter] postNotificationName:@"Start" object:nil userInfo:dic];
受け取る側は当然, 発行されたメソッド内で処理です
受け取る側
-(void)start:(NSNotification *)notification { NSString *val = [[notification userInfo] objectForKey:@"key"]; NSLog(@"Start %@", val); // value }
いらなくなったら登録をやめる
登録を削除します, つまり後処理です -(void)deallocあたりに, 書いておけばインスタンスが消えるときに外してくれます
-(void)dealloc { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc removeObserver:self name:@"key" object:nil]; }