NSNotificationCenter peut conduire à des bogues. Connaissez-vous des solutions plus élégantes?
-
27-10-2019 - |
Question
Je peux ajouter deux fois observateur (par accident) au centre de notification et je recevoir des notifications deux fois. Est-il possible d'obtenir une seule notification? Connaissez-vous des solutions plus élégantes?
Je vous montre cet exemple parce que cela peut conduire à des bogues.
- (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
{
}
La solution
Si vous n'êtes pas sûr si vous avez ajouté l'observateur ailleurs, vous pouvez utiliser le code suivant à chaque fois que vous ajoutez un observateur
[[NSNotificationCenter defaultCenter] removeObserver:self name:aName object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:aSelector name:aName object:nil];
De cette façon, vous supprimez l'ancien (si elle existait) et l'ajout d'un nouveau.
Il est pas à 100% échouent la preuve, mais il est un début. Cela pourrait échouer dans les applications multithread où les appels sont faits async ou d'autres situations uniques.
Autres conseils
Vous pouvez également définir un objet à zéro, puis utiliser plus tard cet objet comme était toujours valide.
Tout ne peut pas se faire fail safe.