notification example iphone cocoa notifications addobserver

iphone - example - notification swift 4



Posibles ubicaciones para llamar a los métodos addObserver y removeObserver (3)

Tengo un caso donde la vista secundaria envía notificaciones a su vista principal. Ahora llamo a addObserver: en viewWillAppear: y removeObserver: en viewWillDisappear: Pero, supongo que esto no es correcto ya que viewWillAppear: llama cuando la vista se actualiza.

[[NSNotificationCenter defaultCenter] addObserver: (id)observer selector: (SEL)aSelector name: (NSString *)aName object: (id)anObject]; [[NSNotificationCenter defaultCenter] removeObserver: (id)observer name: (NSString *)aName object: (id)anObject];

Gracias.


En realidad, esta es una mala idea. Cuando la memoria baja, su controlador de vista puede recibir una advertencia de memoria. El comportamiento predeterminado en esta instancia es borrar su vista (si no está actualmente en la pantalla). En este caso, podría recibir el mensaje viewDidLoad enviado por segunda vez (después del evento de memoria, cuando su controlador de navegación vuelva a mostrar la vista en la pantalla). Así tendrá dos registros del mismo objeto, pero solo una eliminación (en su trato)

Una mejor solución es establecer un indicador que indique que se ha registrado o registrarse en su método init.


Ben tiene razón, pero encontré otra manera, potencialmente frágil, de evitarlo. Acabo de descubrir esto porque siempre iba a obtener el "... se desasoció mientras los observadores de valores clave todavía estaban registrados con él"

No sé por qué, pero cuando tenía addObserver en mi método init y removeObserver en mi método dealloc, seguía recibiendo el mensaje KVO. Di un paso y verifiqué que mi removeObserver se llamaba correctamente.

Moví mi addobserver al método viewDidLoad y pareció funcionar.

Dejé un removeObserver en viewDidUnload y en dealloc; pero no me gusta porque no está equilibrado. Pero en circunstancias normales, mi viewDidUnload no se llama, esto es solo protección en caso de recibir una notificación de poca memoria.

Pero puedo ver potencialmente entrar en la situación en la que aparece un evento de poca memoria, se llama a viewDidUnload. Si luego presiono dealloc en algún momento después de eso (antes de presionar viewDidLoad nuevamente), ¡llamaré a removeObserver dos veces!

Entonces, creo que lo mantendré en mi viewDidLoad, y mi dealloc.

Todavía no sé por qué no funciona bien si hago el addobserver en mi método init.


Supongo que la posición correcta para registrarse es el método viewDidLoad , y la posición correcta para anular el registro de las mismas notificaciones es el método dealloc .