web-dev-qa-db-ja.com

NSNotificationCenterイベントは同期的または非同期的に受信されますか?

クラスが特定のタイプのNSNotificationCenterイベントに登録し、別のクラスがそのタイプのイベントを投稿する場合、レシーバーのコードは、投稿クラスが続行する前(同期)または後に(非同期)実行されますか?

- (void)poster {
    [[NSNotificationCenter defaultCenter]
        postNotificationWithName:@"myevent"
        object:nil];
    NSLog(@"Hello from poster");
}

- (void)receiver {
    [[NSNotificationCenter defaultCenter]
        addObserver:self
        selector:@selector:(mySelector)
        name:@"myevent"
        object:nil];
}

- (void) mySelector:(NSNotification *) notification {
    NSLog(@"Hello from receiver");
}

上記のコード例では、「Hellofromreceiver」は「Hellofromcaller」の前または後に印刷されますか?

36
Munna89

NSNotificationCenterのドキュメントに記載されているように NSNotificationCenterクラスリファレンス 通知は同期して投稿されます。

通知センターは、オブザーバーに同期的に通知を配信します。つまり、postNotification:メソッドは、すべてのオブザーバーが通知を受信して​​処理するまで戻りません。通知を非同期で送信するには、NSNotificationQueueを使用します。

マルチスレッドアプリケーションでは、通知は常に通知が投稿されたスレッドで配信されます。これは、オブザーバーが自分自身を登録したスレッドとは異なる場合があります。

それがあなたを助けることを願っています。

83
Nishant Tyagi