Я использую socket.io
свое быстрое приложение для iOS.
Сейчас на нескольких панелях я слушаю сервер и жду входящих сообщений. Я делаю это, вызывая 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
и включить его в вызываемую функцию?
источник
NSNotificationCenter.defaultCenter().postNotificationName("hideSpinner", object: nil, userInfo: yourvalue)
yourValue
в функции, которая вызывается в этом уведомлении (вshowSpinningWheel
)?.userinfo
Likenotification.userinfo
Ответы:
Swift 2.0
Передать информацию, используя
userInfo
необязательный словарь типа [NSObject: AnyObject]?Версия Swift 3.0 и выше
UserInfo теперь принимает [AnyHashable: Any]? в качестве аргумента, который мы предоставляем как словарный литерал в Swift
ПРИМЕЧАНИЕ. «Имена» уведомлений больше не являются строками, а имеют тип Notification.Name, поэтому мы используем
NSNotification.Name(rawValue:"notificationName")
и можем расширить Notification.Name с помощью наших собственных настраиваемых уведомлений.источник
Для Swift 3
Для Swift 4
источник
Привет @sahil, обновляю твой ответ для Swift 3
Надеюсь, это поможет. Спасибо
источник
вот как я это реализую.
источник
В Swift 4.2 я использовал следующий код для отображения и скрытия кода с помощью NSNotification.
источник