NSNotificationCenter kann zu Fehlern führen.Kennen Sie elegantere Lösungen?
-
27-10-2019 - |
Frage
Ich kann Beobachter zweimal (aus Versehen) zum Benachrichtigungscenter hinzufügen und erhalte zweimal Benachrichtigungen. Ist es möglich, nur eine Benachrichtigung zu erhalten?Kennen Sie elegantere Lösungen?
Ich zeige Ihnen dieses Beispiel, da dies zu Fehlern führen kann.
- (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
{
}
Lösung
Wenn Sie nicht sicher sind, ob Sie den Beobachter an einer anderen Stelle hinzugefügt haben, können Sie bei jedem Hinzufügen eines Beobachters den folgenden Code verwenden.
[[NSNotificationCenter defaultCenter] removeObserver:self name:aName object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:aSelector name:aName object:nil];
Auf diese Weise entfernen Sie die alte (falls vorhanden) und fügen eine neue hinzu.
Es ist nicht 100% ausfallsicher, aber es ist ein Anfang.Dies kann in Multithread-Apps fehlschlagen, in denen die Anrufe asynchron oder in anderen einzigartigen Situationen getätigt werden.
Andere Tipps
Sie können ein Objekt auch auf Null setzen und dieses Objekt später so verwenden, als ob es noch gültig wäre.
Nicht alles kann ausfallsicher gemacht werden.