NSNotification竞争条件

时间:2010-03-24 19:13:43

标签: iphone cocoa race-condition nsnotifications

在单个线程中使用NSNotifications时是否存在竞争条件问题?这是一个示例方法:

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

}

条件之后的前两个调用将触发mainPane将接收的NSNotifications。 mainPane是否保证在这些通知之后收到playerToggled消息?我应该说这个代码似乎按照需要工作(playerToggled总是执行最后)。但是我不确定通知的时间问题是什么,我找不到具体的答案。

2 个答案:

答案 0 :(得分:5)

没有预期的竞争条件。除了Dan Donaldson的回答,这里还有来自NSNotificationCenter文档的另一个引用:

  

通知中心同步向观察者发送通知。换句话说,postNotification:方法在所有观察者都收到并处理通知之前不会返回。要异步发送通知,请使用NSNotificationQueue。

答案 1 :(得分:3)

我不确定你的意思,但我认为这会对你有所帮助:

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

特别是这部分: 使用NSNotificationCenter的postNotification:方法及其变体,您可以向通知中心发布通知。但是,方法的调用是同步的:在发布对象可以恢复其执行的线程之前,它必须等到通知中心将通知发送给所有观察者并返回。