2010-09-26 14 views
15

Ad un certo punto in un codice si può aggiungere qualcosa di simileiPhone - testare se una notifica esiste

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

Come faccio a testare se la notifica è già attiva sulla coda o è stato rimosso, per evitare che l'aggiunta di un duplicare?

grazie.

+0

Eventuali duplicati di [Come evitare l'aggiunta di molteplici osservatore NSNotification ?] (http://stackoverflow.com/questions/5658426/how-to-avoid-adding-multiple-nsnotification-observer) –

risposta

25

Se si intende "testare se si è già registrato come osservatore per la notifica", non penso che ci sia un modo semplice oltre a postare la notifica e vedere che si ottiene una richiamata (con effetti potenzialmente disastrosi) .

Se c'è il rischio di un doppio add, di solito uso [[NSNotificationCenter defaultCenter] removeObserver:self name:foo object:bar] prima dell'aggiunta.

La registrazione per le notifiche non si verifica su una coda.

+4

Non è pericoloso rimuovere un osservatore senza knowin g se c'è un osservatore da rimuovere? Non è come liberare un oggetto già rilasciato? non farebbe schiantare l'app? – SpaceDog

+0

@Digital Robot; Lo faccio sempre. Non si schianta. –

+4

1. Non è come un doppio rilascio/doppio libero, poiché NSNotificationCenter non conserva il "target" o "oggetto" (presumibilmente mantiene il "nome"). 2. NSNotificationCenter tiene traccia delle tuple (target, selettore, nome, oggetto). * Deve * fare, perché deve sapere cosa rimuovere quando si chiama removeObserver: o removeObserver: name: object :. 3. I metodi "remove" generalmente implicano "non fare nulla se non è stato aggiunto (es.' - [NSMutableSet removeObjectForKey:] ',' - [NSArray removeObject:] ') –

Problemi correlati