NSNotification nicht gesendet werden, wenn postNotificationName: genannt
-
22-09-2019 - |
Frage
Ich versuche, eine Instanz zu erhalten verwendet NSNotificationCenter
mit addObserver
und postNotificationName
aber ich kann nicht herausfinden, warum es nicht funktioniert.
Ich habe 2 Zeilen Code, um den Betrachter zu addieren und die Nachricht in zwei verschiedenen Klassen senden
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(newEventLoaded:) name:@"Event" object:nil];
und
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];
Wenn ich den Namen setzen Sie ihn auf nil
funktioniert gut becuase es ist nur eine Sendung, wenn ich versuche, und definieren eine Benachrichtigung Namen die Nachrichten nie durch.
Lösung
All mein Code nutzt NSNotifications
etwa so:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView) name:@"ScanCompleted" object:nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"ScanCompleted" object:nil];
Die erste ist die Registrierung der Benachrichtigung und die zweite Veröffentlichung der Anmeldung.
Andere Tipps
Im Grunde ist es mit der Reihenfolge der Ausführung zu tun. Wenn Sie postNotificationName vor addObserver ausgeführt haben, dann ist dies ein einfaches Problem zu haben. Verwenden von Haltepunkten und Schritt durch den Code:)
Ihr erster Haltepunkt sollte hier aufhören:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView:) name:@"ScanCompleted" object:nil];
Dann hier:
[[NSNotificationCenter defaultCenter]postNotificationName:@"ScanCompleted" object:self];
Also, stellen Sie sicher, hat der Wähler einen Doppelpunkt auf. Weil es die Methode Signatur wird sein:
- (void)updateView:(NSNotification *)notification;
Ich hatte das gleiche Problem. Der Grund dafür ist, dass ich removeObserver Verfahren bei
genannt- (void)viewDidDisappear:(BOOL)animated{
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter removeObserver:self];
}
So überprüfen, ob, wenn Sie removeObserver vor postNotification genannt hatte.
. Tipps: Sie können das Stichwort „removeObserver“ suchen, um zu finden, wenn Sie diese Funktion aufgerufen hatte
Ändern Sie diese:
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];
folgt aus:
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:nil];
Wenn Sie Ihre erste Benachrichtigung ordnungsgemäß registriert ist, sollte newEventLoaded aufgerufen werden.
Ich hatte ein ähnliches Problem und mein Problem war aufgrund der Mitteilung auf einem anderen Thread aufgerufen wird. Dies löste mein Problem.
dispatch_async(dispatch_get_main_queue(),^{
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];
});
Haben Sie noch andere Namen versucht, aber @ „Ereignis“ und null? Nur um sicherzugehen, könnten Sie Ihre Ereignisnamen in einer Datei definieren und dass in beide Anmeldung Anmeldung und senden. Zum Beispiel:
Header-Datei:
extern NSString * const NOTE_myEventName;
Die Quelldatei:
NSString * const NOTE_myEventName = @"MyEventName";
Anmeldung:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleMyEvent:)
name:NOTE_myEventName
object:nil];
Benachrichtigung zu senden:
[[NSNotificationCenter defaultCenter]
postNotificationName:NOTE_myEventName object:nil];
ich erfolgreich fixierte mein „NSNotification
nicht gesendet werden, wenn postNotificationName:
genannt“ zum Absturz bringen.
Ich fand der wirkliche Fehler ist in Benachrichtigung Handler.
Die postNotificationName
und addObserver
ist alles in Ordnung als der erste Beitrag dieses Threads.