thxou

Ama la sabiduría. Desea el conocimiento.

NSNotificationCenter Y Las Notificaciones

| Comments

Vuelvo a la carga con los tutes sobre iOS después de un tiempo ausente por proyectos personales.

Esta vez os voy a hablar sobre otro tipo de notificaciones, diferentes a las notificaciones locales que vimos hace un tiempo. Estas nuevas notificaciones básicamente encapsulan información acerca de algún tipo de evento. Hay objetos que registran estas notificaciones en lo que podemos llamar una “tabla de notificaciones”, esta tabla está administrada por un centro de notificaciones, que es un objeto NSNotificationCenter. Luego tenemos objetos que se registran como “Observadores” de estas notificaciones, de manera de que cuando una de estas notificaciones es lanzada, todos los observadores “se enteran” de esto y normalmente llevan a cabo alguna acción.

Podría parecer un poco chungo, pero no lo es para nada. Te pongo un ejemplo práctico. Imagina un portal de noticias. Los usuarios entran a este portal y pueden suscribirse a las categorías de noticias que ellos prefieran. Una vez sale una noticia relacionada con categoría a la que el usuario se ha suscrito, entonces le llega un correo electrónico avisándole que hay una nueva noticia, así el usuario puede decidir que hacer en ese momento. Pues bien, si hacemos una comparación sacamos que el usuario que se suscribe a las noticias es el “Observador”, el portal de noticias sería el “centro de notificaciones” (NSNotificationCenter) y el correo electrónico sería la notificación lanzada por el centro de notificaciones.

A tocar código, que es lo que mola

Últimamente escribir tanto texto sin una sola línea de código me da alergia, así que vamos a escribir unas cuantas líneas.

De toda la clase NSNotificationCenter, normalmente solo vamos a usar 4 métodos. El primero es para inicializar nuestro centro de notificaciones. Cada aplicación viene con uno por defecto y para acceder a el usamos un método de clase que lo que hace simplemente es crear un singleton:

1
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

Ya tenemos nuestra instancia en el objeto center. El segundo método nos va a permitir registrar una notificación en el centro de notificaciones. A este método le pasamos el nombre de nuestra notificación y un objeto que es el que envía la notificación, normalmente self:

1
[center postNotificationName:@"kTestNotification" object:self];

Se podrían separar estas notificaciones en 2 tipos: las personalizadas (como esta) y las que emite el sistema. En las que emite el sistema (por ejemplo cuando el dispositivo es girado o el teclado de un textField es mostrado), no necesitamos usar el método anterior ya que el sistema lo hace solo, nosotros solo tenemos que añadirnos como observadores de esas notificaciones y esperar, así que esto es lo que haremos ahora.

Registrándonos como observadores

Antes vimos el método para registrar una notificación llamada kTestNotification en el centro de notificaciones. Bien, ahora nos haremos “Observadores” de esta notificación para que cuando sea registrada (Osea, cuando sea ejecutado el método anterior), nosotros podamos llevar a cabo alguna acción en ese mismo instante:

1
2
3
4
[center addObserver:self
		   selector:@selector(handleNotification:)
			   name:@"kTestNotification"
			 object:nil];

El gustillo de este tipo de notificaciones para mi está en que, suponiendo el caso de que tu aplicación tenga 100 controladores, no importa en cual de estos 100 controladores registres la notificación, añadiendo tu clase como observador serás capaz de enterarte cuando sea registrada, en cualquier momento y en cualquier controlador.

Cuando el centro de notificaciones avisa a los observadores sobre una notificación lo hace de manera síncrona. Esto quiere decir que vas a tener que esperar primero a que todos los observadores reciban sus notificaciones antes de poder hacer algo. Esto se puede solucionar registrando las notificaciones de forma asíncrona usando NSNotificationQueue en vez de NSNotificationCenter, pero esto ya es otro tema del que hablaremos en otra oportunidad.

Al añadirnos como observadores también definimos un método a ejecutarse cuando la notificación sea registrada:

1
2
3
4
- (void)handleNotification:(NSNotification *)notification
{
	NSLog(@"Hey tu!, se ha disparado la notificación!");
}

Aquí simplemente mostramos por consola un texto, pero tu puedes usarlo para lo que quieras, cosas como mostrar un controlador, cerrar una conexión a Internet, etc.

Liberando la memoria

Lo único que nos queda ahora es liberar la memoria removiendo el observador que hemos asignado antes:

1
2
3
4
- (void)dealloc {
    // liberamos la memoria que ocupa el observador
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

Como vez, no estamos utilizando el objeto center, y a decir verdad para ahorrarte una innecesaria línea de código te recomiendo no crear un objeto NSNotificationCenter, sino usar la forma: [[NSNotificationCenter defaultCenter] ... , como en el código de arriba.

Comments