NSNotificationCenter pode levar a erros. Sabe soluções mais elegantes?
-
27-10-2019 - |
Pergunta
posso adicionar observador duas vezes (por acidente) para o centro de notificação e vou receber notificações duas vezes. É possível obter apenas uma notificação? Sabe soluções mais elegantes?
Eu mostro-lhe este exemplo, porque isso pode levar a erros.
- (void)viewDidLoad
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidShow:)
name:UIKeyboardDidShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidShow:)
name:UIKeyboardDidShowNotification
object:nil];
}
- (void)keyboardDidShow:(NSNotification *)ntf
{
}
Solução
Se você não tem certeza se você adicionou o observador em outro lugar, você pode usar o seguinte toda código que você está adicionando um Observer
[[NSNotificationCenter defaultCenter] removeObserver:self name:aName object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:aSelector name:aName object:nil];
Desta forma, você está removendo o antigo (se existisse) e adicionar um novo.
Não é 100% não prova, mas é um começo. Isso poderia falhar em multi-threaded aplicações onde as chamadas estão sendo feitas assíncrona ou outras situações únicas.
Outras dicas
Você também pode definir um objeto para nulo e, posteriormente, usar esse objeto como se ainda era válido.
Nem tudo pode ser feito à prova de falhas.