NSNotification便利ですよね。デリゲートが実装しづらいようなパターンの場合に大活躍。そういえば、みんな通知とデリゲートの使い分けって、どうしてるんだろ。僕がNSNotificationを使うのは、通知先が複数ある/オブジェクトがものすごく遠い…っていう感じで使い分けているけど。まぁ、デリゲートよりも書くの楽なのでついつい使ってしまって、後からコードが追いにくくなるという諸刃の刃。
それはともかく、NSNotificationを使って通史を受信できないという事態に遭遇したのでメモ。
NSObjectとUIViewControllerの通知/受信の場合
通知側
// 通知の送信
NSNotification *n = [NSNotification notificationWithName:@"HogeComplete" object:self];
[[NSNotificationCenter defaultCenter] postNotification:n];
受信側
// 通知受取の登録(通常は、 addObserver こちら)
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(HogeComplete) name:@"HogeComplete" object:nil];
// 受け取り時の実行メソッド
-(void)HogeComplete{
NSLog(@"通知受信完了");
}
まぁ、普通はこう書きますよね。でも、NSObject同士でやると受信できない!しかもエラーにもならない。そりゃそうだ。
NSObject同士の通知/受信の場合
受信側
// NSObject同士の場合は、 addObserverForName こちらを使う
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserverForName:@"HogeComplete"
object:nil
queue:nil
usingBlock:^(NSNotification *note) {
[self HogeComplete];
}];
NSObjectの場合は、受信側を addObserverForName こちらで登録する必要がある…と。