2010-09-26 19 views
15

En algún momento de un código se puede añadir algo comoiPhone - probar si existe una notificación

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomething) name:@"Hello" object:nil]; 

¿Cómo puedo probar si la notificación ya está activa en la cola o se ha eliminado, para evitar la adición de una ¿duplicar?

gracias.

+0

duplicado posible de [Cómo evitar la adición de múltiples observadores NSNotification ?] (http://stackoverflow.com/questions/5658426/how-to-avoid-adding-multiple-nsnotification-observer) –

Respuesta

25

Si quiere decir "probar si ya se ha registrado como observador para la notificación", no creo que haya una manera fácil aparte de publicar la notificación y ver que reciba una devolución de llamada (con efectos posiblemente desastrosos) .

Si existe el peligro de que se agreguen dos veces, normalmente utilizo [[NSNotificationCenter defaultCenter] removeObserver:self name:foo object:bar] antes del complemento.

El registro de notificaciones no ocurre en una cola.

+4

No es peligroso quitar un observador sin saber g si hay un observador para eliminar? ¿No es como liberar un objeto ya lanzado? ¿No se estrellaría la aplicación? – SpaceDog

+0

@Digital Robot; Hago esto todo el tiempo. No se cuelga. –

+4

1. No es como una liberación doble/doble, ya que NSNotificationCenter no retiene el "objetivo" u "objeto" (presumiblemente retiene "nombre"). 2. NSNotificationCenter realiza un seguimiento de las tuplas (objetivo, selector, nombre, objeto). Es * debe * hacer, porque tiene que saber qué eliminar cuando se llama a removeObserver: o removeObserver: name: object :. 3. Los métodos "eliminar" generalmente implican "no hacer nada si no se ha agregado" (por ejemplo, '- [NSMutableSet removeObjectForKey:]', '- [NSArray removeObject:]') –

Cuestiones relacionadas