NSNotification гонки условия - PullRequest
2 голосов
/ 24 марта 2010

Есть ли проблемы с расой при использовании NSNotifications в одном потоке? Вот пример метода:

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

}

Первые два вызова после условия вызовут уведомления NSNotification, которые будут получены mainPane. Гарантируется ли mainPane получение сообщения playerToggled после этих уведомлений? Я должен сказать, что этот код работает должным образом (playerToggled всегда выполняется последним). Но я не уверен, какие проблемы с синхронизацией возникают вокруг уведомлений, и я не могу найти конкретный ответ.

Ответы [ 2 ]

5 голосов
/ 24 марта 2010

Условия гонки не ожидаются. В дополнение к ответу Дэна Дональдсона, есть еще одна цитата из документов для NSNotificationCenter:

Центр уведомлений доставляет уведомления наблюдателям синхронно. Другими словами, методы postNotification: не возвращаются до тех пор, пока все наблюдатели не получат и не обработают уведомление. Для асинхронной отправки уведомлений используйте NSNotificationQueue.

3 голосов
/ 24 марта 2010

Я не совсем уверен, что вы имеете в виду, но я думаю, что это будет полезно для вас:

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

Особенно эта часть: Используя метод postNotification: Центр NSNotificationCenter и его варианты, вы можете опубликовать уведомление в центре уведомлений. Однако вызов метода является синхронным: прежде чем объект публикации может возобновить поток выполнения, он должен дождаться, пока центр уведомлений отправит уведомление всем наблюдателям и вернется.

...