Condição de corrida de NSNotificação
-
22-09-2019 - |
Pergunta
Existem problemas de condição de corrida ao usar o nsnotificações em um único thread? Aqui está um método de amostra:
- (void) playerToggled: (NSNotification *) notification {
if (timerPane.playing && ! timerPane.paused) {
[playerPane toggleCurrentPlayer];
[timerPane toggleTimer];
[mainPane playerToggled];
}
}
As duas primeiras chamadas após a condição acionarão as NSNotificações que serão recebidas pelo Mainpane. O Mainpane é garantido para receber a mensagem PlayerTogggled após essas notificações? Devo dizer que esse código parece funcionar conforme desejado (o Playertoggled sempre é executado por último). Mas não tenho certeza de quais problemas de tempo existem em torno das notificações e não consigo encontrar uma resposta específica.
Solução
Não sei exatamente o que você quer dizer, mas acho que isso será útil para você:
Especialmente esta parte: usando a pós -Notificação do NSNotificationCenter: Método e suas variantes, você pode postar uma notificação em um centro de notificação. No entanto, a invocação do método é síncrona: antes que o objeto de postagem possa retomar seu encadeamento de execução, ele deve esperar até que o centro de notificação envie a notificação a todos os observadores e retornos.
Outras dicas
Não há condições de raça de se esperar. Além da resposta de Dan Donaldson, aqui está outra citação dos documentos para o NSNotificationCenter:
Um centro de notificação oferece notificações aos observadores de maneira síncrona. Em outras palavras, a pós -notificação: os métodos não retornam até que todos os observadores tenham recebido e processado a notificação. Para enviar notificações, use assíncrono nsnotificationQueue.