ios - objeto de acceso pasado en NSNotification?
objective-c nsnotifications (6)
Tengo una NSNotification que está publicando un NSDictionary:
NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
anItemID, @"ItemID",
[NSString stringWithFormat:@"%i",q], @"Quantity",
[NSString stringWithFormat:@"%@",[NSDate date]], @"BackOrderDate",
[NSString stringWithFormat:@"%@", [NSDate date]],@"ModifiedOn",
nil];
[[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"InventoryUpdate" object:dict]];
¿Cómo me suscribo a esto y obtengo información de este NSDictionary?
en mi viewDidLoad tengo:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(recieveInventoryUpdate:) name:@"InventoryUpdate" object:nil];
y un método en la clase:
- (void)recieveInventoryUpdate:(NSNotification *)notification {
NSLog(@"%@ updated", [notification userInfo]);
}
que registra un valor nulo por supuesto.
El object
de la notificación está destinado a ser el remitente , en su caso, el diccionario no es realmente el remitente , es solo información. Cualquier información auxiliar que se envíe junto con la notificación está destinada a transmitirse junto con el diccionario de userInfo
del userInfo
. Enviar la notificación como tal:
NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
anItemID,
@"ItemID",
[NSString stringWithFormat:@"%i",q],
@"Quantity",
[NSString stringWithFormat:@"%@", [NSDate date]],
@"BackOrderDate",
[NSString stringWithFormat:@"%@", [NSDate date]],
@"ModifiedOn",
nil];
[[NSNotificationCenter defaultCenter] postNotification:
[NSNotification notificationWithName:@"InventoryUpdate"
object:self
userInfo:dict]];
Y luego recibalo de esta manera, para obtener el comportamiento que pretendes de buena manera:
- (void)recieveInventoryUpdate:(NSNotification *)notification {
NSLog(@"%@ updated", [notification userInfo]);
}
El objeto es qué objeto está publicando la notificación, no una forma de almacenar el objeto para que pueda acceder a él. La información del usuario es donde almacena la información que desea conservar con la notificación.
[[NSNotificationCenter defaultCenter] postNotificationName:@"Inventory Update" object:self userInfo:dict];
Entonces regístrese para la notificación. El objeto puede ser de su clase o nulo para recibir todas las notificaciones de este nombre.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(recieveInventoryUpdate:) name:@"InventoryUpdate" object:nil];
A continuación utilízalo en tu selector.
- (void)recieveInventoryUpdate:(NSNotification *)notification {
NSLog(@"%@ updated", [notification userInfo]);
}
Es simple, ver más abajo.
- (void)recieveInventoryUpdate:(NSNotification *)notification {
NSLog(@"%@ updated",notification.object); // gives your dictionary
NSLog(@"%@ updated",notification.name); // gives keyname of notification
}
Si accede a la notification.userinfo
, devolverá null
.
Lo estas haciendo mal. Necesitas usar:
-(id)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)userInfo
y pasar el dictado al último parámetro. Su parámetro "objeto" es el objeto que envía la notificación y no el diccionario.
es [notification object]
también puede enviar userinfo usando notificationWithName:object:userInfo:
method
Rápido:
// Propagate notification:
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: ["info":"your dictionary"])
// Subscribe to notification:
NotificationCenter.default.addObserver(self, selector: #selector(yourSelector(notification:)), name: NSNotification.Name(rawValue: "notificationName"), object: nil)
// Your selector:
func yourSelector(notification: NSNotification) {
if let info = notification.userInfo, let infoDescription = info["info"] as? String {
print(infoDescription)
}
}
// Memory cleaning, add this to the subscribed observer class:
deinit {
NotificationCenter.default.removeObserver(self)
}