2

シングルスレッド内でNSNotificationsを使用する場合、競合状態の問題はありますか?サンプルメソッドは次のとおりです。

- (void) playerToggled: (NSNotification *) notification {
if (timerPane.playing && ! timerPane.paused) {
    [playerPane toggleCurrentPlayer];
    [timerPane toggleTimer];
    [mainPane playerToggled];
}

}

条件の後の最初の2つの呼び出しは、mainPaneによって受信されるNSNotificationsをトリガーします。mainPaneは、これらの通知の後にplayerToggledメッセージを受信することが保証されていますか?このコードは希望どおりに機能しているようです(playerToggledは常に最後に実行されます)。しかし、通知の周りにどのようなタイミングの問題があるのか​​わかりません。具体的な答えを見つけることができません。

4

2 に答える 2

5

予想される競合状態はありません。Dan Donaldsonの回答に加えて、NSNotificationCenterのドキュメントからの別の引用があります。

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

于 2010-03-24T19:26:52.360 に答える
3

私はあなたが何を意味するのか正確にはわかりませんが、これはあなたに役立つと思います:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/Notifications/Articles/NotificationQueues.html#//apple_ref/doc/uid/20000217

特にこの部分:NSNotificationCenterのpostNotification:メソッドとそのバリアントを使用して、通知センターに通知を投稿できます。ただし、メソッドの呼び出しは同期的です。投稿オブジェクトが実行スレッドを再開する前に、通知センターがすべてのオブザーバーに通知をディスパッチして戻るまで待機する必要があります。

于 2010-03-24T19:24:09.760 に答える