Dentro de una Aplicación de las que hago uso de varios viewcontrollers. En un viewcontroller un observador es inicializado como sigue:

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

Incluso cuando la eliminación de la NSNotification antes de inicializar el número de ejecuciones de myMethod: se resume la cantidad de repetirse puntos de vista sobre los respectivos viewcontroller.

¿Por qué sucede esto y cómo puedo evitar myMethod: ser llamado más de una vez.

Nota: de hecho estoy seguro que mediante el uso de puntos de corte que no he cometido errores en llamar producida después de la notificación varias veces.

Edit: Esto es como mi producida después de la notificación se parece a

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 pasar mi suscripción a viewwillappear: obtengo el mismo resultado. myMethod: se llama varias veces. (número de veces que se me vuelva a cargar el viewcontroller).

-(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];
}

edit: algo parece estar mal con mi ciclo de vida. ViewDidUnload y dealloc no están recibiendo la llamada, sin embargo viewdiddisappear está recibiendo la llamada.

La forma en que me empuje a mi Viewcontroller a la pila es el siguiente, donde el padre es un formato tableview subclase (clic en la fila que esta viewcontroller se inicia:

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 guía!

  • la solución está trabajando para mí thanq….
  • thnx solución : ayudado
InformationsquelleAutor BarryK88 | 2013-11-06

4 Comentarios

  1. 35

    Según esta descripción, una causa probable es que su viewcontrollers están sobre-retenidos y no se libera cuando se piensa que son. Esto es bastante común, incluso con ARCO si las cosas están más conservados. Entonces, usted piensa que usted tiene sólo una instancia de un determinado viewcontroller activa, mientras que en realidad tiene varias vivir de los casos, y todos ellos se escuchan las notificaciones.

    Si yo estuviera en esta situación, me gustaría poner un punto de interrupción en el viewcontroller del método dealloc y asegúrese de que se cancela la asignación correctamente, si esa es la intención de diseño de la aplicación.

    • De hecho, a mi viewDidUnload y método dealloc que no está recibiendo la llamada. Todavía tengo que hacer neto por qué. (editado mi pregunta)
    • Usted también debe removeObserver:yo en el controlador de vista del método dealloc si usted no está haciendo eso. De lo contrario, el NSNotificationCenter retendrá el controlador de vista, y nunca llega desasignado.
    • Por CIERTO, viewDidUnload sólo funciona < ios 6. Así, no es de esperar que el fuego si está usando nada > 5.
    • No sé referencia removido o no, pero en la parte de atrás del botón que estoy haciendo yo.navigationController.popToRootViewController(animado : true). Mi Observador está llamando de tiempo múltiples. ¿Puede por favor explicar a mí.?
  2. 37

    En los métodos que hizo registrar los observadores?

    Apple recomienda que los observadores deben estar registrados en el viewWillAppear: y no en viewWillDissapear:

    Está seguro de que usted no se registra en el observador de la dos veces?

    • Yo inicializar dentro de la initWith: método de inicio de
    • Yo no lo agregue al inicio del método. 2 razones: 1) yo no podría estar formado correctamente y 2) es posible que nunca lo hacen en la pantalla, en cuyo caso es probable que no desee agregar a su notificación.
    • mejor nota, solucionado mi problema, señor!
  3. 3

    Topó con este problema en una aplicación que se ejecuta swift. La aplicación recibió la notificación de una vez cuando se lanzó por primera vez. la notificación a que aumenta el número de veces que se pase a un segundo plano y volver. yo.e

    • lanza aplicación de un complemento observador obtiene se llama una vez en la vista de la comparecencia o vista hizo de carga de notificación se llama una vez
    • de la aplicación pasa a segundo plano y viene de vuelta, agregar observador se llama de nuevo en la vista de la comparecencia o vista hizo de carga. la notificación se llama dos veces.
    • el número aumenta con el número de veces que vaya a fondo y volver.
    • código en la vista desaparecerá hará ninguna diferencia ya que la vista es todavía en la pila de la ventana y no ha sido retirado.

    solución:
    observar la aplicación de renunciar activo en su controlador de vista:

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

    esto se asegurará de que su punto de vista controlador va a quitar el observador de la notificación cuando la vista se va al fondo.

  4. 1

    es muy posible que la suscripción a las notificaciones

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

    antes de auto se inicializa. Y tratando de darse de baja del «yo», que en realidad no es suscrito, y usted recibirá todo el mundial myNotification notificaciones.

    Si su vista se quedó enganchado en IB, uso -awakeFromNib: como el punto de partida para registrarse para recibir notificaciones

Dejar respuesta

Please enter your comment!
Please enter your name here