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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top