2012-06-29 13 views
9

Ho il seguente codice:NSNotificationCenter un post fa sì che gli osservatori di essere chiamato due volte

[[NSNotificationCenter defaultCenter] postNotificationName:kNewsfeedFetchCompleted object:self userInfo:userinfo]; 

solo questo, in nessun altro posto. Ed ecco come ho impostato l'osservatore:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newsfeedFetchCompleted:) name:kNewsfeedFetchCompleted object:nil]; 

domanda è quando faccio un post il newsfeedFetchCompleted viene chiamato due volte .. come è questo possibile?

+0

[[NSNotification defaultCenter] removeObserver: self] – janusbalatbat

+0

cosa intendi? perché dovrei farlo? – xonegirlz

+2

AddObserver potrebbe essere richiamato più volte per lo stesso oggetto, generando più notifiche. Dove stai chiamando addObserver? –

risposta

23

Questo è possibile quando il codice per addObserver viene eseguito due volte. La funzione di notifica verrà chiamata tante volte quante sono registrate.

Quindi assicurati che il codice per l'aggiunta di observer sia eseguito solo per una volta. Quindi, puoi mantenerlo nel metodo viewDidLoad o init.

Se lo si sta visualizzando viewWillAppear, rimuovere observer in viewWillDisAppear.

+0

L'ho effettivamente aggiunto al nome initWithNib – xonegirlz

+0

In tal caso, quando si rilascia dealcontroller, si è perso l'errore di rimuovereObserver nel metodo dealloc. – Apurv

+0

Quindi, se il controller di visualizzazione viene creato una seconda volta, l'osservatore verrà registrato di nuovo e la funzione verrà richiamata due volte. – Apurv

2

È possibile se è stato aggiunto lo stesso osservatore più volte per la notifica newsfeedFetchCompleted. È necessario abbinare le chiamate addObserver con le chiamate removeObserver.

Ad esempio se è stato aggiunto l'osservatore in viewWillAppear/viewWillDidAppear/ViewDidLoad di un UIViewController, è necessario rimuoverlo in viewWillDisappear/viewDidDisappear/ViewDidUnload.

La chiamata remove corrispondente addObserver, è removeObserver:name:object:

Maggiori informazioni si possono trovare nel NSNotificationCenter docs

8

prima di aggiungere osservatore, assicurarsi di rimuovere l'osservatore precedente aggiunto.

[[NSNotificationCenter defaultCenter]removeObserver:self]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newsfeedFetchCompleted:) name:kNewsfeedFetchCompleted object:nil]; 
+1

Questo dovrebbe avere più voti. Mi ha davvero aiutato a risolvere un problema in cui il mio metodo veniva chiamato troppe volte. –

Problemi correlati