我正在socket.io快速的ios应用程序中实现。
socket.io
目前,在几个面板上,我正在侦听服务器并等待传入消息。我这样做是通过getChatMessage在每个面板中调用该函数:
getChatMessage
func getChatMessage(){ SocketIOManager.sharedInstance.getChatMessage { (messageInfo) -> Void in dispatch_async(dispatch_get_main_queue(), { () -> Void in //do sth depending on which panel user is }) } }
但是我注意到这是一个错误的方法,我需要更改它-现在我只想开始监听一次传入的消息,并且当出现任何消息时-将此消息传递给任何侦听它的面板。
所以我想通过NSNotificationCenter传递传入的消息。到目前为止,我能够传递发生了某些事情的信息,但无法传递数据本身。我这样做的原因是:
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.showSpinningWheel(_:)), name: showSpinner, object: nil)
然后我有一个函数叫做:
func showSpinningWheel(notification: NSNotification) { }
每当我想称呼它时,我都在做:
NSNotificationCenter.defaultCenter().postNotificationName(hideSpinner, object: self)
那么如何传递对象messageInfo并将其包含在调用的函数中呢?
messageInfo
雨燕2.0
传递信息使用的userInfo是[NSObject:AnyObject]类型的可选词典?
userInfo
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 } }
Swift 3.0及更高版本
现在,userInfo需要[AnyHashable:Any]吗?作为参数,我们在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 // For swift 4.0 and above put @objc attribute in front of function Definition func showSpinningWheel(_ notification: NSNotification) { if let image = notification.userInfo?["image"] as? UIImage { // do something with your image } }
注意: 通知“名称”不再是字符串,而是类型为Notification.Name,因此,为什么要使用它NSNotification.Name(rawValue:"notificationName"),我们可以使用自己的自定义通知扩展Notification.Name。
NSNotification.Name(rawValue:"notificationName")
extension Notification.Name { static let myNotification = Notification.Name("myNotification") } // and post notification like this NotificationCenter.default.post(name: .myNotification, object: nil)