2010-06-18 7 views
22

Esto no es una pregunta tanto como una advertencia a otros para ahorrarles algo de tiempo.Advertencia para usuarios de iOS/iPhone sobre observaciones NSNotification duplicadas

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 se NO reconozca la redundancia y, en su lugar, se activarán tantas notificaciones para usted como haya registrado una observación.

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

Ejemplo:

Quiero que 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 exactamente la misma notificación, resolviendo al 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 subprocesos, este es un mundo de dolor. Créeme.

Simplemente poniendo esto por si acaso hay otros que se encuentran con algo como esto.

+1

Es bueno tener la advertencia: probablemente debas poner la mayor parte de esto en una respuesta y aceptarlo :) (señal Alex Trebek murmurando algo acerca de 'debes expresar tu respuesta ...') –

+0

Me tomó suficiente tiempo, pero listo. –

Respuesta

4

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 se NO reconozca la redundancia y, en su lugar, se activarán tantas notificaciones para usted como haya registrado una observación.

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

Ejemplo:

Quiero que 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 exactamente la misma notificación, resolviendo al 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 subprocesos, este es un mundo de dolor. Créeme.

Simplemente poniendo esto por si acaso hay otros que se encuentran con algo como esto.

+0

Este es un error del codificador, no un error de biblioteca. Solo regístrese para recibir las notificaciones que desea recibir. No estoy seguro de por qué se registraría en el mismo objeto varias veces para la misma notificación. – chadbag

+0

Ese fue mi punto. –

+0

en situaciones donde tienes un controlador de vista base que tiene un observador y algunos otros controladores de vista extienden esa clase base, luego si el código para agregar el observador está en los métodos del ciclo de vida de vista como viewDidLoad o viewDidAppear, una forma de evitar que los observadores agregado a la Tabla de despacho es mediante la eliminación del observador y luego agregarlo a la vista se cargó. De esta forma, el observador no se agregará varias veces. –

0

Como usted mismo ha dicho, NSNotificationCenter no hace ninguna comprobación de duplicados, 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 la adición de objetivos a ciertos objetos, pero a menudo hay un reconocimiento de teclas en esos.

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

+0

Considere el sistema completo detrás de esto, ¿tiene sentido? ¿Podría decirnos más detalles? Gracias. –

2

que debe y siempre limpiar sus observadores.
La forma más fácil de hacerlo es: [[NSNotificationCenter defaultCenter] removeObserver: self]
viewDidLoad no es un buen lugar para agregar observadores, porque estas funciones pueden ser llamadas varias veces, esto ocurre cuando se activa viewDidUnload. Un buen lugar para poner su addObservers en viewWillAppear y removeObservers en viewWillDisappear.

+0

también, viewDidUnload está en desuso y ya no se llama en iOS 6 –

Cuestiones relacionadas