Pregunta

Esto no es una cuestión tanto como una advertencia a los demás les ahorrar algo de tiempo.

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

Si se registra a sí mismo varias veces para la notificación específica exacta, NSNotificationCenter no reconocer la redundancia y en lugar de disparar el mayor número de notificaciones a usted como que se haya registrado para una observación.

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

Ejemplo:

Quiero mi controlador de vista para recibir las notificaciones de un objeto de red aislado cuando llegan nuevos datos:

- (void) viewDidLoad 
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:) 
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

pero antes ya había puesto la misma cosa en viewWillAppear:

- (void) viewWillAppear
{
    [super viewWillAppear];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:)
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

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

En este caso, si no quito una de esas llamadas addObserver, voy a conseguir notificaciones duplicadas a mi controlador de vista.

En un entorno multi-hilo, este es un mundo de dolor. Confía en mí.

El sólo poner esto hacia fuera allí en caso de que hay otros que se ejecutan en algo como esto.

¿Fue útil?

Solución

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

Si se registra a sí mismo varias veces para la notificación específica exacta, NSNotificationCenter no reconocer la redundancia y en lugar de disparar el mayor número de notificaciones a usted como que se haya registrado para una observación.

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

Ejemplo:

Quiero mi controlador de vista para recibir las notificaciones de un objeto de red aislado cuando llegan nuevos datos:

- (void) viewDidLoad 
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:) 
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

pero antes ya había puesto la misma cosa en viewWillAppear:

- (void) viewWillAppear
{
    [super viewWillAppear];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:)
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

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

En este caso, si no quito una de esas llamadas addObserver, voy a conseguir notificaciones duplicadas a mi controlador de vista.

En un entorno multi-hilo, este es un mundo de dolor. Confía en mí.

El sólo poner esto hacia fuera allí en caso de que hay otros que se ejecutan en algo como esto.

Otros consejos

Se debe y siempre limpiar sus observadores.
La forma más sencilla de hacerlo es: [[NSNotificationCenter defaultCenter] removeObserver: auto]
viewDidLoad no es un buen lugar para añadir observadores, ya que estas funciones pueden ser llamado varias veces, esto ocurre cuando se activa viewDidUnload. Un buen lugar para poner sus addObservers en viewWillAppear y removeObservers en viewWillDisappear.

Como usted mismo ha dicho, NSNotificationCenter hace ninguna comprobación de duplicados, lo que puede ser molesto para algunos, pero tiene sentido cuando concidering el sistema completo detrás de él.

La misma lógica se aplica a añadir objetivos a ciertos objetos, pero a menudo hay un reconocimiento de llave en ellos.

Gracias por la información, y por una buena, la advertencia de SEO-friendly:)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top