espaƱa apple iphone ios macos nsnotificationcenter nsnotifications

apple - Advertencia para los usuarios de iOS/iPhone sobre las observaciones duplicadas de NSNotification



iphone se (3)

Esto no es tanto una pregunta como una advertencia a otros para ahorrarles algo de tiempo.

NSNotificationCenter en iOS 3 / iPhone OS 3 (asumo también que Mac OS X y iOS 4) tiene el siguiente comportamiento:

Si se registra varias veces para recibir la notificación específica exacta, NSNotificationCenter NO reconocerá la redundancia y, en su lugar, le enviará tantas notificaciones para las que haya registrado una observación.

Este es casi nunca el comportamiento que desea ver y casi siempre es accidental.

Ejemplo:

Quiero que mi controlador de vista reciba notificaciones de un objeto de red Singleton cuando entren nuevos datos:

- (void) viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newDataArrived:) name:NewDataArrivedNotification object:[NetworkListener sharedNetworkListener]]; }

pero antes ya había puesto lo mismo en viewWillAppear :

- (void) viewWillAppear { [super viewWillAppear]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newDataArrived:) name:NewDataArrivedNotification object:[NetworkListener sharedNetworkListener]]; }

Tenga en cuenta que es exactamente la misma notificación, que se resuelve en el mismo observador, remitente y nombre de notificación.

En este caso, si no elimino una de esas llamadas addObserver, recibiré notificaciones duplicadas en mi controlador de vista.

En un entorno de múltiples hilos, este es un mundo de dolor. Créeme.

Solo pongo esto por ahí en caso de que haya otros que encuentren algo como esto.


Como usted mismo dijo, NSNotificationCenter no comprueba si hay duplicados, lo que puede ser molesto para algunos, pero tiene sentido cuando se considera el sistema completo detrás de él.

La misma lógica se aplica al agregar objetivos a ciertos objetos, pero a menudo hay un reconocimiento clave en ellos.

Gracias por la información y por una buena advertencia amigable con SEO :)


Debes y siempre limpia a tus observadores.
La forma más fácil de hacerlo es: [[NSNotificationCenter defaultCenter] removeObserver: self]
viewDidLoad no es un buen lugar para agregar observadores, ya que a estas funciones se les puede llamar varias veces, esto sucede cuando se activa viewDidUnload. Un buen lugar para poner sus addObservers en viewWillAppear y eliminarObservers en viewWillDisappear.


NSNotificationCenter en iOS 3 / iPhone OS 3 (asumo también que Mac OS X y iOS 4) tiene el siguiente comportamiento:

Si se registra varias veces para recibir la notificación específica exacta, NSNotificationCenter NO reconocerá la redundancia y, en su lugar, le enviará tantas notificaciones para las que haya registrado una observación.

Este es casi nunca el comportamiento que desea ver y casi siempre es accidental.

Ejemplo:

Quiero que mi controlador de vista reciba notificaciones de un objeto de red Singleton cuando entren nuevos datos:

- (void) viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newDataArrived:) name:NewDataArrivedNotification object:[NetworkListener sharedNetworkListener]]; }

pero antes ya había puesto lo mismo en viewWillAppear :

- (void) viewWillAppear { [super viewWillAppear]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newDataArrived:) name:NewDataArrivedNotification object:[NetworkListener sharedNetworkListener]]; }

Tenga en cuenta que es exactamente la misma notificación, que se resuelve en el mismo observador, remitente y nombre de notificación.

En este caso, si no elimino una de esas llamadas addObserver, recibiré notificaciones duplicadas en mi controlador de vista.

En un entorno de múltiples hilos, este es un mundo de dolor. Créeme.

Solo pongo esto por ahí en caso de que haya otros que encuentren algo como esto.