2010-01-23 9 views
8

Sto avendo alcuni problemi di cui la mia notifica pubblicato:Metodi per il debug dei problemi di NSNotificationCenter?

[[NSNotificationCenter defaultCenter] postNotificationName:@"MobileProviderChanged" 
                object:self.selectedProviderID]; 

non è stato intrappolato dal mio osservatore:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(onProviderChanged:) 
              name:@"MobileProviderChanged" 
              object:nil]; 

L'esatto stesso osservatore funziona correttamente in un ViewController diverso.

Eventuali suggerimenti sui metodi per eseguire il debug di questo ulteriore per vedere quali messaggi vengono effettivamente inviati a defaultCenter?

Grazie.

+0

Più mi occupo di questo problema, mi chiedo se il mio problema è che il viewcontroller di invio è su un thread diverso rispetto al viewcontroller di osservazione. – CBGrey

+0

Hey Greypoint: il thread che avvia la notifica non dovrebbe avere importanza. Il metodo dell'osservatore verrà richiamato su qualsiasi thread su cui è stata pubblicata la notifica, quindi dovresti stare attento a questo. Se hai problemi a rintracciare le notifiche tramite la tua app dovresti controllare http://www.sparkinspector.com - che ha uno strumento per monitorarle. –

risposta

1

Più mi ricerca di questo problema che ho meravigliarsi se il mio problema è che l'invio di viewcontroller si trova su un thread diverso rispetto al osservando viewcontroller.

Il multi-threading errato è quasi sicuramente la fonte del problema. Tuttavia, le notifiche dovrebbero comunque essere inviate e ricevute.

In particolare, una notifica verrà ricevuta su qualsiasi thread è stato inviato. Dato che dici che stai parlando con i controller di visualizzazione in risposta alla notifica, è molto probabile che tu stia facendo qualcosa su un thread non principale di cui l'UIKit non è soddisfatto.

+0

Grazie bbum. Come posso assicurarmi che il mio controller di visualizzazione di invio e il controller di visualizzazione di osservazione (sono padre/figlio tramite controller di navigazione) si trovino sullo stesso thread? O è possibile che siano su fili diversi? – CBGrey

+0

La notifica verrà sempre gestita sullo stesso thread. Quello è il problema. Se i controller della vista non sono thread-safe, dovrebbero sempre essere messaged sul thread principale e, quindi, tutte le notifiche * devono * essere pubblicate sul thread principale. – bbum

+0

Hm, due cose mi fanno pensare che si tratti effettivamente dello stesso thread ... Ho modificato la mia notifica per usare: "performSelectorOnMainThread" (forzandolo al thread principale) ma ancora non funziona. In secondo luogo, ho usato "Strumenti" per tracciare l'attività del thread e sembra che entrambi siano sul thread principale (se ho capito cosa vedo). Frustrante. Qualche modo per tracciare NSNotifications o in qualche modo convalidare che il mio addObserver sia stato effettivamente aggiunto? – CBGrey

1

Ha avuto lo stesso problema. La soluzione è abbastanza semplice, ma non ovvia:

Assicurarsi che l'osservatore esista ancora durante l'invio di NSNotification.

Problemi correlati