NSNotification non essere inviato quando postNotificationName: chiamato
-
22-09-2019 - |
Domanda
Sto cercando di ottenere un esempio di utilizzo NSNotificationCenter
con addObserver
e postNotificationName
ma non riesco a capire perché non funzionerà.
Ho 2 linee di codice per aggiungere l'osservatore e inviare il messaggio in 2 diverse classi
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(newEventLoaded:) name:@"Event" object:nil];
e
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];
Se ho impostato il nome per nil
funziona benissimo becuase è solo una trasmissione, quando provo e definire un nome di notifica dei messaggi non arrivano mai attraverso.
Soluzione
Tutto il mio codice fa uso di NSNotifications
in questo modo:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView) name:@"ScanCompleted" object:nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"ScanCompleted" object:nil];
Il primo sta registrando la notifica e il secondo invio della notifica.
Altri suggerimenti
In sostanza è tutto a che fare con l'ordine di esecuzione. Se hai eseguito postNotificationName prima addObserver, allora questo è un problema facile da avere. Utilizzare i punti di interruzione ed eseguire il codice:)
Il primo punto di interruzione dovrebbe fermarsi qui:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView:) name:@"ScanCompleted" object:nil];
Poi qui:
[[NSNotificationCenter defaultCenter]postNotificationName:@"ScanCompleted" object:self];
Inoltre, assicurarsi che il selettore ha due punti su. Perché è firma del metodo sarà:
- (void)updateView:(NSNotification *)notification;
Ho avuto lo stesso problema. Il motivo è che ho chiamato metodo removeObserver a
- (void)viewDidDisappear:(BOOL)animated{
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter removeObserver:self];
}
Quindi, verificare se se si fosse chiamato removeObserver prima postNotification.
Punte:. È possibile cercare la parola chiave "removeObserver" per trovare se avessi chiamato questa funzione
Modificare questa:
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];
a questo:
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:nil];
Se la prima notifica è registrata correttamente, newEventLoaded dovrebbe essere chiamato.
Ho avuto un problema simile e il mio problema era dovuto alla notifica di essere chiamato su un altro thread. Ciò ha risolto il mio problema.
dispatch_async(dispatch_get_main_queue(),^{
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];
});
Hai provato tutti gli altri nomi, ma @ "Evento" e nullo? Giusto per essere sicuri, si potrebbe definire i nomi degli eventi in un unico file e comprendono che in entrambi la registrazione di notifica e l'invio. Ad esempio:
File di intestazione:
extern NSString * const NOTE_myEventName;
File di origine:
NSString * const NOTE_myEventName = @"MyEventName";
Registrazione:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleMyEvent:)
name:NOTE_myEventName
object:nil];
Notifica di invio:
[[NSNotificationCenter defaultCenter]
postNotificationName:NOTE_myEventName object:nil];
ho fissato con successo il mio "NSNotification
non essere inviato quando postNotificationName:
chiamato" crash.
Ho trovato il vero bug è nel gestore di messaggi di notifica.
Il postNotificationName
e addObserver
stanno bene come il primo post di questo thread.