wunderlist webapp sesión log iniciar ingresar google faq ios iphone uiviewcontroller nsnotificationcenter nsnotifications

ios - webapp - ¿Por qué mi NSNotificación se llama su observador varias veces?



wunderlist webapp (4)

Dentro de una aplicación hago uso de varios controladores de vista. En un controlador de vista, un observador se inicializa de la siguiente manera:

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"MyNotification" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMethod:) name:@"MyNotification" object:nil];

Incluso cuando se elimina la NSNotification antes de inicializar el número de ejecuciones de myMethod: se está myMethod: por la cantidad de vistas repetidas en el controlador de vista respectivo.

¿Por qué sucede esto y cómo puedo evitar mi Método: ser llamado más de una vez?

Nota: Me aseguré de usar puntos de interrupción que no cometí errores al llamar a postNotification varias veces.

Edición: Así es como se ve mi notificación de notificaciones

NSArray * objects = [NSArray arrayWithObjects:[NSNumber numberWithInt:number],someText, nil]; NSArray * keys = [NSArray arrayWithObjects:@"Number",@"Text", nil]; NSDictionary * userInfo = [NSDictionary dictionaryWithObjects:objects forKeys:keys]; [[NSNotificationCenter defaultCenter] postNotificationName:@"myNotification" object:self userInfo:userInfo];

edit: incluso después de mover mi suscripción a viewwillappear: obtengo el mismo resultado. myMethod: se llama varias veces. (Número de veces que recargo el controlador de vista).

-(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[NSNotificationCenter defaultCenter] removeObserver:self name:@"MyNotification" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMethod:) name:@"MyNotification" object:nil]; }

Edición: algo parece mal con mi ciclo de vida. ViewDidUnload y dealloc no se llaman, sin embargo se llama viewdiddisappear.

La forma en que empujo mi controlador de vista a la pila es la siguiente: donde padre es una subclase de vista de tabla (al hacer clic en la fila se inicia este controlador de vista:

detailScreen * screen = [[detailScreen alloc] initWithContentID:ID andFullContentArray:fullContentIndex andParent:parent]; [self.navigationController pushViewController:screen animated:YES];

Solución:

Mover la eliminación de nsnotification a viewdiddisappear hizo el truco. Gracias por la orientación!


¿En qué métodos se registraron los observadores?

Apple recomienda que los observadores se registren en viewWillAppear: y no se viewWillDissapear: en viewWillDissapear:

¿Estás seguro de que no registras el observador dos veces?


De acuerdo con esta descripción, una causa probable es que sus controladores de vista se conservan en exceso y no se liberan cuando usted cree que sí lo están. Esto es bastante común incluso con ARC si las cosas se sobre-retienen. Entonces, piensa que solo tiene una instancia de un controlador de vista determinado activo, mientras que en realidad tiene varias instancias en vivo y todas escuchan las notificaciones.

Si estuviera en esta situación, pondría un punto de interrupción en el método dealloc del controlador de vista y me aseguraría de que esté desasignado correctamente, si ese es el diseño previsto de su aplicación.


Es muy posible que te estés suscribiendo a las notificaciones.

[[NSNotificationCenter defaultCenter] postNotificationName:@"myNotification" object:self userInfo:userInfo];

antes de que el yo se inicialice. Y al intentar cancelar la suscripción a ''self'' al cual no está realmente suscrito, obtendrá todas las notificaciones globales de myNotification .

Si su vista estaba conectada en IB, use -awakeFromNib: como punto de partida para registrarse para recibir notificaciones


Se encontró con este problema en una aplicación que se ejecuta de forma rápida. La aplicación recibió la notificación una vez cuando se lanzó por primera vez. La notificación aumenta la cantidad de veces que entra en segundo plano y vuelve. es decir

  • la aplicación lanza uno: agregar un observador se recibe una llamada una vez en la vista aparecerá o la vista se cargó: la notificación se llamará una vez
  • la aplicación se pone en segundo plano y vuelve, se agrega o se carga la vista. La notificación es llamada dos veces.
  • el número aumenta la cantidad de veces que entras en segundo plano y regresas.
  • el código a la vista desaparecerá y no hará ninguna diferencia, ya que la vista aún se encuentra en la pila de ventanas y no se ha eliminado de ella.

solución: observar que la aplicación va a renunciar activa en su controlador de vista:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "applicationWillResign:", name: UIApplicationWillResignActiveNotification, object: nil) func applicationWillResign(notification : NSNotification) { NSNotificationCenter.defaultCenter().removeObserver(self) }

esto asegurará que su controlador de vista eliminará el observador de la notificación cuando la vista pase al fondo.