NSNotificationCenter

Los frameworks de GNUstep proveen una forma muy sencilla de mandar mensajes a objetos mediante lo que se conoce como una notificación. Este forma de enviar mensajes es útil cuando no contamos con un Outlet hacia el objeto al cual queremos enviar el mensaje, situación que se presenta a menudo cuando dichos objetos son creados en tiempo de ejecución. Para ello, lo primero que debemos hacer es registrar los objetos que deben recibir los mensajes en el Centro de Notificaciones, dichos objetos se conocen como Observadores. El Centro de Notificaciones es un objeto que gestiona las notificaciones y las envía a los respectivos observadores. Podemos pensar en él como en una oficina de correo postal. Las notificaciones son entonces las cartas y los observadores son los destinatarios. Generalmente un observador se registra en el centro de notificaciones desde el momento en que se crea (en algún método init). Esto se hace de la siguiente forma:

[[NSNotificationCenter defaultCenter]
addObserver: self
selector: @selector (metodoAEjecutar:)
name: @"nombre de la notiticacion"
object: algunObjeto];

Observese que cada notificación tiene un nombre asociado. Cuando el objeto observador vaya a ser liberado, debemos remover dicho observador en el centro de notificaciones de la siguiente forma:

[[NSNotificationCenter defaultCenter] removeObserver: self];

Por ejemplo, si queremos saber cuando el usuario ha cambiado las preferencias, podríamos poner algo como:

Notificacion1

Registramos nuestro objeto (self) para que se ejecute el método -preferencesChanged: (el cual debemos implementar en nuestro objeto observador) cada vez que se reciba la notificación con el nombre “preferencesHasChanged”, y dicho método llevara a cabo los cambios realizados por el usuario en las preferencias. El método –preferencesChanged: debe recibir como parámetro un objeto NSNotification:

Notification3

En el objeto remitente, el que manda la notificación, el código ha ejecutar cada vez que queramos mandar la notificación, sería el siguiente (siguiendo nuestro ejemplo anterior):

Notificacion2

Aquí posteamos la notificación con el nombre “preferencesHasChanged” pasando como argumento nuestro objeto remitente (self) y como información de usuario nil (en caso de pasar este argumento, debe ser un objeto NSDictionary con alguna información útil para el observador). Y esto es todo. Cada vez que el objeto remitente envía una notificación mediante el código anterior, el método -preferencesChanged: se ejecutara en el objeto observador. Observese que podemos registrar varios objetos observadores para recibir la misma notificación.

El método -preferencesChanged: puede saber que objeto envió la notificación, preguntándole al objeto notification que recibe como parámetro:

id objeto = [notification object];

U obtener la información que le envía el remitente (si la hay):

NSDictionary *info = [notification userInfo];

Para más información consultese la documentación oficial.