objective iphone objective-c ios nsnotifications

iphone - objective - Cómo detener al observador en NSNotification para llamar dos veces?



nsnotificationcenter (5)

Intenta eliminarObserver en el método viewWillDisappear:

-(void)viewWillDisappear:(BOOL)animated{ [[NSNotificationCenter defaultCenter] removeObserver:self name:@"startAnimating" object:nil]; }

Tengo un observador de NSNotification que se llama dos veces. No sé qué hacer con eso.

Busqué en Google pero no encontré ninguna solución.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(connectedToServer:) name:@"ConnectedToServer" object:nil]; - (void)connectedToServer:(NSNotification*)notification { [[NSNotificationCenter defaultCenter] postNotificationName:@"SendMessageToServer" object:message]; }


Intente establecer un punto de interrupción en [[NSNotificationCenter defaultCenter] addObserver:self selector:aSelector name:aName object:nil]; y verificar si se llama más de una vez.


Para aquellos que buscan una solución en Swift 2.2 y superior y que han llegado a esta pregunta como yo, pueden crear una extensión de la siguiente manera:

import Foundation extension NSNotificationCenter { func setObserver(observer: AnyObject, selector: Selector, name: String?, object: AnyObject?) { NSNotificationCenter.defaultCenter().removeObserver(observer, name: name, object: object) NSNotificationCenter.defaultCenter().addObserver(observer, selector: selector, name: name, object: object) } }

Puede llamar a este método de la siguiente manera:

NSNotificationCenter.defaultCenter().setObserver(self, selector: #selector(methodName), name: "name", object: nil)

La extensión manejará la eliminación del observador anterior si existe. Incluso si no hubiera un observador previo presente, este código no se bloqueará.


Si su método addObserver se ejecuta varias veces, creará múltiples observadores. Mi problema fue que, de alguna manera, coloqué a mi observador en la vista viewWillAppear que apareció varias veces antes de publicar la notificación, lo que provocó que llamaran a mi observador varias veces.

Si bien la tercera solución de EmptyStack funciona, hay una razón por la que se llama a su observador dos veces, por lo que al encontrarlo, puede evitar líneas innecesarias de código en lugar de eliminar y agregar el mismo observador.

Sugeriría poner a su observador en viewDidLoad para evitar errores simples como el que experimenté.


Solución 1: Lo primero es comprobar si la notificación en sí misma se publica dos veces.

Solución 2: incluso si la notificación se publica solo una vez, se llamará a la acción tantas veces que haya agregado el observador para la notificación (no importa si la notificación es la misma o no). Por ejemplo, las siguientes dos líneas registrarán el observador ( self ) para la misma notificación (un aSelector ) dos veces.

[[NSNotificationCenter defaultCenter] addObserver:self selector:aSelector name:aName object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:aSelector name:aName object:nil];

Debe encontrar dónde está agregando un observador por segunda vez y eliminarlo. Y también asegúrese de que el código donde se agrega el observador no se llame dos veces.

Solución 3: si no está seguro de si ya ha agregado el observador o no, simplemente puede hacer lo siguiente. Esto asegurará que el observador se agregue solo una vez.

[[NSNotificationCenter defaultCenter] removeObserver:self name:aName object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:aSelector name:aName object:nil];