如何在swift 3.0中使用NotificationCenter和在swift 2.0中使用NSNotificationCenter传递数据? [英] How to pass data using NotificationCenter in swift 3.0 and NSNotificationCenter in swift 2.0?
问题描述
我正在快速的ios应用程序中实现socket.io
.
I'm implementing socket.io
in my swift ios app.
当前在几个面板上,我正在侦听服务器并等待传入消息.我是通过在每个面板中调用getChatMessage
函数来实现的:
Currently on several panels I'm listening to the server and wait for incoming messages. I'm doing so by calling the getChatMessage
function in each 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
})
}
}
但是我发现这是一个错误的方法,我需要更改它-现在,我只想开始监听一次传入的消息,并且在出现任何消息时-将此消息传递给任何侦听它的面板.
However I noticed it's a wrong approach and I need to change it - now I want to start listening for incoming messages only once and when any message comes - pass this message to any panel that listens to it.
所以我想通过NSNotificationCenter传递传入的消息.到目前为止,我能够传递发生了某些事情的信息,但无法传递数据本身.我这样做的方式是:
So I want to pass the incoming message through the NSNotificationCenter. So far I was able to pass the information that something happened, but not pass the data itself. I was doing that by:
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.showSpinningWheel(_:)), name: showSpinner, object: nil)
然后我有一个名为:
func showSpinningWheel(notification: NSNotification) {
}
任何时候我都想打电话给我,
and any time I wanted to call it I was doing:
NSNotificationCenter.defaultCenter().postNotificationName(hideSpinner, object: self)
那么如何传递对象messageInfo
并将其包含在被调用的函数中?
So how can I pass the object messageInfo
and include it in the function that gets called?
推荐答案
Swift 2.0
使用userInfo
传递信息,该信息是[NSObject:AnyObject]类型的可选词典?
Pass info using userInfo
which is a optional Dictionary of type [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
}
}
Swift 3.0版本及更高版本
用户信息现在需要[AnyHashable:Any]?作为参数,我们在Swift中将其作为字典文字提供
The userInfo now takes [AnyHashable:Any]? as an argument, which we provide as a dictionary literal in 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.
NOTE: Notification "names" are no longer strings, but are of type Notification.Name, hence why we are using NSNotification.Name(rawValue:"notificationName")
and we can extend Notification.Name with our own custom notifications.
extension Notification.Name {
static let myNotification = Notification.Name("myNotification")
}
// and post notification like this
NotificationCenter.default.post(name: .myNotification, object: nil)
这篇关于如何在swift 3.0中使用NotificationCenter和在swift 2.0中使用NSNotificationCenter传递数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!