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)