Buscar..


Introducción

Las notificaciones de iOS son una forma simple y poderosa de enviar datos de manera flexible. Es decir, el remitente de una notificación no tiene que preocuparse por quién (si alguien) recibe la notificación, simplemente la publica en el resto de la aplicación y puede ser recogida por muchas cosas o nada dependiendo de Estado de su aplicación.

Fuente : - HACKING con Swift

Parámetros

Parámetro Detalles
nombre El nombre de la notificación para la cual se registra al observador; es decir, solo se usan notificaciones con este nombre para agregar el bloque a la cola de operaciones. Si pasa nulo, el centro de notificaciones no usa el nombre de una notificación para decidir si agregar el bloque a la cola de operaciones.
obj El objeto cuyas notificaciones el observador quiere recibir; es decir, solo las notificaciones enviadas por este remitente se envían al observador. Si pasa nulo, el centro de notificaciones no utiliza un remitente de notificación para decidir si se lo entrega al observador.
cola La cola de operaciones a la que se debe agregar el bloque. Si pasa nulo, el bloqueo se ejecuta de forma síncrona en el hilo de publicación.
bloquear El bloque a ejecutar cuando se recibe la notificación. El bloque es copiado por el centro de notificaciones y (la copia) se mantiene hasta que se elimina el registro del observador.

Observaciones

Un objeto NSNotificationCenter (o simplemente, centro de notificación) proporciona un mecanismo para transmitir información dentro de un programa. Un objeto NSNotificationCenter es esencialmente una tabla de despacho de notificaciones.

Para más información, echa un vistazo a la documentación de Apple aquí

NSNotification & NSNotificationCenter en Swift

Añadiendo un observador

Convenio de denominación

Las notificaciones son identificadas por objetos NSString globales cuyos nombres se componen de esta manera:

Name of associated class + Did | Will + UniquePartOfName + Notification

Por ejemplo:

  • NSApplicationDidBecomeActiveNotification
  • NSWindowDidMiniaturizeNotification
  • NSTextViewDidChangeSelectionNotification
  • NSColorPanelColorDidChangeNotification

Swift 2.3

NSNotificationCenter.defaultCenter().addObserver(self, 
                                                 selector: #selector(self.testNotification(_:)), 
                                                 name: "TestNotification", 
                                                 object: nil)

Swift 3

NSNotificationCenter.default.addObserver(self, 
                                         selector: #selector(self.testNotification(_:)), 
                                         name: NSNotification.Name(rawValue: "TestNotification"), 
                                         object: nil)

C objetivo

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

PD: También vale la pena señalar que el número de veces que se ha agregado un observador tiene que ser exactamente el número de veces que se elimina el observador. Un error de novato es agregar el observador en el viewWillAppear: de un UIViewController, pero eliminar el observador en viewDidUnload: provocará un número desigual de empujes y, por lo tanto, se perderán el observador y el selector de notificaciones de forma superflua.

Removiendo observadores

Swift 2.3

//Remove observer for single notification
NSNotificationCenter.defaultCenter().removeObserver(self, name: "TestNotification", object: nil)
    
//Remove observer for all notifications
NotificationCenter.defaultCenter().removeObserver(self)

Swift 3

//Remove observer for single notification
NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "TestNotification"), object: nil)

//Remove observer for all notifications
NotificationCenter.default.removeObserver(self)

C objetivo

//Remove observer for single notification
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"TestNotification" object:nil];
    
//Remove observer for all notifications
[[NSNotificationCenter defaultCenter] removeObserver:self];

Publicar una notificación

Rápido

NSNotificationCenter.defaultCenter().postNotificationName("TestNotification", object: self)

C objetivo

[[NSNotificationCenter defaultCenter] postNotificationName:@"TestNotification" object:nil];

Publicar una notificación con datos

Rápido

let userInfo: [String: AnyObject] = ["someKey": myObject]
NSNotificationCenter.defaultCenter().postNotificationName("TestNotification", object: self, userInfo: userInfo)

C objetivo

NSDictionary *userInfo = [NSDictionary dictionaryWithObject:myObject forKey:@"someKey"];
[[NSNotificationCenter defaultCenter] postNotificationName: @"TestNotification" object:nil userInfo:userInfo];

Observando una Notificación

Rápido

func testNotification(notification: NSNotification) {
    let userInfo = notification.userInfo
    let myObject: MyObject = userInfo["someKey"]
}

C objetivo

- (void)testNotification:(NSNotification *)notification {
    NSDictionary *userInfo = notification.userInfo;
    MyObject *myObject = [userInfo objectForKey:@"someKey"];
}

Agregar / eliminar un observador con un bloque

En lugar de agregar un observador con un selector, se puede usar un bloque:

id testObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"TestNotification"
                                                                    object:nil 
                                                                     queue:nil 
                                                                usingBlock:^(NSNotification* notification) {
    NSDictionary *userInfo = notification.userInfo;
    MyObject *myObject = [userInfo objectForKey:@"someKey"];
}];

El observador puede ser eliminado con:

[[NSNotificationCenter defaultCenter] removeObserver:testObserver 
                                                name:@"TestNotification"
                                              object:nil];

Añadir y eliminar el observador por nombre

// Add observer
let observer = NSNotificationCenter.defaultCenter().addObserverForName("nameOfTheNotification", object: nil, queue: nil) { (notification) in
    // Do operations with the notification in this block
}

// Remove observer
NSNotificationCenter.defaultCenter().removeObserver(observer)


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow