iOS
NSNotificationCenter
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í
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)