ios objective-c nsnotifications

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) }