NSNotificationCenter può portare a bug.Conosci soluzioni più eleganti?
-
27-10-2019 - |
Domanda
Posso aggiungere due volte l'osservatore (per sbaglio) al centro notifiche e riceverò le notifiche due volte. È possibile ricevere una sola notifica?Conosci soluzioni più eleganti?
Ti mostro questo esempio perché questo potrebbe portare a bug.
- (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
{
}
Soluzione
Se non sei sicuro di aver aggiunto l'osservatore da qualche altra parte, puoi utilizzare il seguente codice ogni volta che aggiungi un osservatore
[[NSNotificationCenter defaultCenter] removeObserver:self name:aName object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:aSelector name:aName object:nil];
In questo modo rimuovi quello vecchio (se esisteva) e ne aggiungi uno nuovo.
Non è a prova di errore al 100%, ma è un inizio.Ciò potrebbe non riuscire nelle app multi-thread in cui le chiamate vengono effettuate in modo asincrono o in altre situazioni uniche.
Altri suggerimenti
Puoi anche impostare un oggetto su nil e poi utilizzarlo in seguito come se fosse ancora valido.
Non tutto può essere protetto dai guasti.