2010-01-21 22 views
14

Sto cercando di ottenere un'istanza di utilizzo di NSNotificationCenter con addObserver e postNotificationName ma non riesco a capire perché non funzionerà.NSNotifica non inviata quando postNotificationName: chiamato

Ho 2 linee di codice per aggiungere l'osservatore e inviare il messaggio in 2 classi diverse

[[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 a definire un nome di notifica i messaggi non riescono mai a passare.

risposta

12

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 è la registrazione della notifica e il secondo invio della notifica.

+3

Questo è esattamente quello che devo ancora si rifiuta di lavorare, mi porta a pensare che il problema è altrove, ma il centro di notifica sembra essere del tutto autonomo il codice-saggio. Non ho idea di dove altro cercare ciò che potrebbe causare il problema. Threading forse? L'iPhone è automaticamente multi-thread? Non che io sappia. – Affian

+0

fa un comunicato NSLog nel selettore (nel mio caso updateView) funziona correttamente? Se il metodo non accetta parametri cercare il nome del metodo, senza il: così '[addObserver [NSNotificationCenter defaultCenter]: auto selettore: @selector (newEventLoaded) Nome: @ oggetto "Evento": nil];' –

+0

Tutto il mio test ha è stato fatto con un NSLog nel metodo selezionato e funziona quando ho impostato il nome del notificatore su zero. Ho anche provato con e senza parametri nel metodo di – Affian

5

Modifica questo:

[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self]; 

a questo:

[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:nil]; 

Se la prima notifica è registrata correttamente, newEventLoaded dovrebbe essere chiamato.

+1

No, ho provato varie combinazioni dei valori degli oggetti e dei valori degli eventi ma l'unico che riesco a lavorare sembra avere il nome impostato come nullo, a meno che mi manchi qualcosa nel documentazione. – Affian

+1

+1. Grazie! Che ha lavorato – Dexter

+0

+1 Questo mi ha aiutato, grazie –

1

Hai provato altri nomi tranne @ "Evento" e zero? Per sicurezza, è possibile definire i nomi degli eventi in un unico file e includerli nella registrazione e nell'invio delle notifiche. Ad esempio: file

intestazione: file di

extern NSString * const NOTE_myEventName; 

Fonte:

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]; 
1

ho risolto con successo il mio crash "NSNotification non essere inviato quando postNotificationName: chiamata".

Ho trovato il vero bug nel gestore dei messaggi di notifica.

Il postNotificationName e addObserver sono bene come il primo post di questo thread.

+1

qual è stato il problema con il gestore di messaggi? E come l'hai risolto? – Meet

11

Fondamentalmente è tutto a che fare con l'ordine di esecuzione. Se hai eseguito postNotificationName prima di addObserver, allora questo è un problema facile da avere.Utilizzare i punti di interruzione ed eseguire il codice :)

Il tuo 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é la firma del metodo sarà:

- (void)updateView:(NSNotification *)notification; 
+0

Grazie per ricordarmi che 'postNotificationName' viene chiamato prima' addObserver'. Ha risolto il mio problema. –

5

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.

+1

Utilizzare il link [modifica] (http://stackoverflow.com/posts/27315932/edit) sotto la tua risposta per correggere il codice di formattazione. – nop77svk

+0

La stessa cosa mi stava succedendo. Mancava del codice che stava effettivamente rimuovendo tutti gli osservatori dopo che avevo aggiunto l'osservatore. Nessuna sorpresa non funzionava. – AndyDunn

3

ho avuto un problema simile e il mio problema era dovuto alla notifica di essere chiamato su un altro thread. Questo ha risolto il mio problema.

dispatch_async(dispatch_get_main_queue(),^{ 
    [[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self]; 
}); 
+1

Grazie! Funziona per me. – Raja

Problemi correlati