2012-06-29 7 views
9

Tengo el siguiente código:NSNotificationCenter un puesto hace que los observadores se llama dos veces

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

sólo esto, no en otro lugar. Y así es como me puse el observador:

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

pregunta es cuando hago un puesto de la newsfeedFetchCompleted se llama dos veces .. ¿cómo es esto posible?

+0

[[NSNotification defaultCenter] removeObserver: self] – janusbalatbat

+0

¿qué quieres decir? ¿Por qué debería incluso hacer eso? – xonegirlz

+2

Se podría llamar a AddObserver más de una vez para el mismo objeto, lo que daría lugar a múltiples notificaciones. ¿A dónde llamas a addObserver? –

Respuesta

23

Esto es posible cuando su código para addObserver se ejecuta dos veces. Se llamará a la función de notificación tantas veces como esté registrada.

Así que asegúrese de que su código para agregar el observador se ejecuta solo una vez. Entonces, puedes mantenerlo en el método viewDidLoad o init.

Si lo está colocando en la vista, aparecerá Eliminar observador en viewWillDisAppear.

+0

De hecho, agregué esto en el nombre de initWithNib – xonegirlz

+0

En ese caso, cuando está desasignando ese controlador de vista, se ha perdido el método removeObserver in dealloc. – Apurv

+0

Por lo tanto, si el controlador de vista se crea por segunda vez, su observador se registrará nuevamente y la función se llamará dos veces. – Apurv

2

Es posible si ha agregado el mismo observador varias veces para la notificación newsfeedFetchCompleted. Debe hacer coincidir sus llamadas de addObserver con las llamadas removeObserver.

Por ejemplo, si agregó el observador en viewWillAppear/viewWillDidAppear/ViewDidLoad de un UIViewController, debe eliminarlo en viewWillDisappear/viewDidDisappear/ViewDidUnload.

La correspondiente convocatoria para quitar addObserver, es removeObserver:name:object:

Más información se puede encontrar en el NSNotificationCenter docs

8

antes de agregar observador, asegúrese de retirar el observador anterior añadió.

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

Esto debería tener más votos. Realmente me ayudó a solucionar un problema donde mi método se llamaba demasiadas veces. –

Cuestiones relacionadas