NSNotificationでNSObject同士だと通知されない問題

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 こちらで登録する必要がある…と。

Feed

最新記事

開発フローを独自進化させ続けている開発チームの話

こんにちは CTO の [@zaru](https://twitter.com/zaru) です。 スクラム開発をしている開発チームが、開発フローを独自進化させていて、それが良い取り組みだったので紹介しようと思います。 #...

235650?v=4
zaru
2017年11月20日

退職者を招いたLTイベントを開催した

こんにちは、ベーシック CTO [@zaru](https://twitter.com/zaru) です。 ベーシック開発部では毎月月末の金曜日にTGIFと称して、 ~~飲み会 + アナログゲームなイベント~~ 技術 LT 大会...

235650?v=4
zaru
2017年10月12日

山形ラボ、TGIFはじめました

こんにちは。株式会社ベーシック山形ラボの長谷川です。 いろんなところで書いたりなんだりしてますが、弊社には山形に「山形ラボ」というリモート拠点がありまして、そこで4人のエンジニアが働いております。 今回は その山形ラボで、...

10917612?v=4
roki1801
2017年10月10日