5

Me gustaría registrar cualquier NSNotifications publicado por un único NSNotificationCenter compartido a través de mi aplicación. He intentado subclasificar NSNotificationCenter con la intención de agregar código de registro a los tres métodos de publicación, pero devuelve una instancia de CFNotification center en lugar de mi subclase.Logging NSNotifications

¿Hay una forma de controlar la publicación de NSNotification?

EDITAR/ACTUALIZAR

Como dos respuestas a continuación correctamente señalan que pude escuchar a todas las notificaciones y registrarlos en un controlador, pero la secuencia del controlador sería recibir estas notificaciones está lejos de ser garantizados para ser el mismo que el secuencia en la que fueron enviados. Si pudiera estar seguro de que el manejador siempre sería el primero en ser notificado esto funcionaría, pero no puedo: 'El orden en que los observadores reciben notificaciones no está definido' De NSNotification Docs

Respuesta

9

Al usar - addObserver:selector:name:object: y pasar nil para name y object, recibirá una notificación sobre cualquier notificación.

- (id)init 
{ 
    self = [super init]; 
    if (self != nil) 
    { 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(log:) name:nil object:nil]; 
    } 
    return self; 
} 

- (void)log:(NSNotification *)notification 
{ 
    NSLog(@"%@", notification); 
} 

Editar: si desea obtener la orden real de las notificaciones siendo enviar, tratar de subclases NSNotificationCenter y sustituyendo los métodos siguientes:

– postNotification: 
– postNotificationName:object: 
– postNotificationName:object:userInfo: 

Si subclases hay ninguna opción para usted, podría considerar definir una categoría en NSNotificationCenter donde anula estos métodos llamando a la súper implementación. (Necesitarás usar los métodos para llamar a súper dentro de una categoría). Dime si necesitas ayuda para hacerlo.

+0

Gracias. Pero el problema es que no puedo registrar pre-enviar. Me dejan para registrar las notificaciones después de que se envían como un observador en una posición arbitraria en la secuencia de observadores que se notificaron. Si puedo iniciar sesión en el punto de envío, tengo una idea mucho más clara de la secuencia de notificación. Este tipo de oyente global podría no ser notificado hasta que un controlador anterior haya activado una secuencia de eventos, lo que significa que no podría ver el orden de envío, solo el orden en que los recibió este observador en particular. – Undistraction

+0

Compruebe mi edición;) –

+0

Gracias. El problema es que cuando asigna/inicia un NSNotificationCenter no recupera un centro NSNotification. Obtiene un CFNotificationCenter. Lo mismo es cierto de una subclase de NSNotificationCenter. ¿Entonces seguramente agregar una categoría a NSNotificationCenter no será de ayuda? – Undistraction

0

Debería poder usar [addObserver: auto selector: @selector (cualquiera :) nombre: nil object: nil] y simplemente ponga su código de registro en el método whatever: method. Este observador debe recibir todas las notificaciones publicadas por su aplicación (al menos todas las publicadas por el centro predeterminado).