uiapplicationdidbecomeactivenotification observer notification defaultcenter create ios swift swift3 nsnotificationcenter nsnotifications

ios - observer - ¿Cómo pasar datos usando NotificationCenter en swift 3.0 y NSNotificationCenter en swift 2.0?



swift 4 notification (5)

Estoy implementando socket.io en mi aplicación swift ios.

Actualmente en varios paneles estoy escuchando al servidor y espero los mensajes entrantes. Lo hago llamando a la función getChatMessage en cada panel:

func getChatMessage(){ SocketIOManager.sharedInstance.getChatMessage { (messageInfo) -> Void in dispatch_async(dispatch_get_main_queue(), { () -> Void in //do sth depending on which panel user is }) } }

Sin embargo, noté que es un enfoque incorrecto y necesito cambiarlo; ahora quiero comenzar a escuchar los mensajes entrantes solo una vez y cuando llegue cualquier mensaje, pasar este mensaje a cualquier panel que lo escuche.

Así que quiero pasar el mensaje entrante a través del NSNotificationCenter. Hasta ahora pude pasar la información de que algo sucedió, pero no pasar los datos en sí. Estaba haciendo eso por:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.showSpinningWheel(_:)), name: showSpinner, object: nil)

entonces tuve una función llamada:

func showSpinningWheel(notification: NSNotification) { }

y cada vez que quería llamarlo estaba haciendo:

NSNotificationCenter.defaultCenter().postNotificationName(hideSpinner, object: self)

Entonces, ¿cómo puedo pasar el objeto messageInfo e incluirlo en la función que se llama?


Para Swift 3

let imageDataDict:[String: UIImage] = ["image": image] // post a notification NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: imageDataDict) // `default` is now a property, not a method call // Register to receive notification in your class NotificationCenter.default.addObserver(self, selector: #selector(self.showSpinningWheel(_:)), name: NSNotification.Name(rawValue: "notificationName"), object: nil) // handle notification func showSpinningWheel(_ notification: NSNotification) { print(notification.userInfo ?? "") if let dict = notification.userInfo as NSDictionary? { if let id = dict["image"] as? UIImage{ // do something with your image } } }

Para Swift 4

let imageDataDict:[String: UIImage] = ["image": image] // post a notification NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: imageDataDict) // `default` is now a property, not a method call // Register to receive notification in your class NotificationCenter.default.addObserver(self, selector: #selector(self.showSpinningWheel(_:)), name: NSNotification.Name(rawValue: "notificationName"), object: nil) // handle notification @objc func showSpinningWheel(_ notification: NSNotification) { print(notification.userInfo ?? "") if let dict = notification.userInfo as NSDictionary? { if let id = dict["image"] as? UIImage{ // do something with your image } } }


En swift 4.2 utilicé el siguiente código para mostrar y ocultar el código usando NSNotification

@objc func keyboardWillShow(notification: NSNotification) { if let keyboardSize = (notification.userInfo? [UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { let keyboardheight = keyboardSize.height print(keyboardheight) } }


Hola @sahil, actualizo tu respuesta para Swift 3

let imageDataDict:[String: UIImage] = ["image": image] // post a notification NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: imageDataDict) // `default` is now a property, not a method call // Register to receive notification in your class NotificationCenter.default.addObserver(self, selector: #selector(self.showSpinningWheel(_:)), name: NSNotification.Name(rawValue: "notificationName"), object: nil) // handle notification func showSpinningWheel(_ notification: NSNotification) { print(notification.userInfo ?? "") if let dict = notification.userInfo as NSDictionary? { if let id = dict["image"] as? UIImage{ // do something with your image } } }

Espero que sea útil. Gracias


let dictionary = self.convertStringToDictionary (responceString)
NotificationCenter.default.post (nombre: NSNotification.Name (rawValue: "SOCKET_UPDATE"), objeto: diccionario)


Swift 2.0

¿Pasar información usando userInfo que es un diccionario opcional de tipo [NSObject: AnyObject]?

let imageDataDict:[String: UIImage] = ["image": image] // Post a notification NSNotificationCenter.defaultCenter().postNotificationName(notificationName, object: nil, userInfo: imageDataDict) // Register to receive notification in your class NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.showSpinningWheel(_:)), name: notificationName, object: nil) // handle notification func showSpinningWheel(notification: NSNotification) { if let image = notification.userInfo?["image"] as? UIImage { // do something with your image } }

Versión Swift 3.0

El userInfo ahora toma [AnyHashable: Any]? como argumento, que proporcionamos como un diccionario literal en Swift

let imageDataDict:[String: UIImage] = ["image": image] // post a notification NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: imageDataDict) // `default` is now a property, not a method call // Register to receive notification in your class NotificationCenter.default.addObserver(self, selector: #selector(self.showSpinningWheel(_:)), name: NSNotification.Name(rawValue: "notificationName"), object: nil) // handle notification func showSpinningWheel(_ notification: NSNotification) { if let image = notification.userInfo?["image"] as? UIImage { // do something with your image } }

NOTA: Los "nombres" de notificación ya no son cadenas, sino que son del tipo Notification.Name, de ahí que estemos usando NSNotification.Name(rawValue:"notificationName") y podemos extender Notification.Name con nuestras propias notificaciones personalizadas.

extension Notification.Name { static let myNotification = Notification.Name("myNotification") } // and post notification like this NotificationCenter.default.post(name: .myNotification, object: nil)