私は私のSwift iosアプリにsocket.io
を実装しています。
現在いくつかのパネルで私はサーバーを聞いていて着信メッセージを待ちます。各パネルで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
})
}
}
しかし、これは間違ったアプローチであることに気付いたので、変更する必要があります。今は1回だけメッセージの受信を開始したいのですが、このメッセージを受信するパネルに渡してください。
だから私はNSNotificationCenterを介して着信メッセージを渡したいです。これまでのところ、何かが起こったという情報を渡すことはできましたが、データ自体を渡すことはできませんでした。私はそれをやっていました:
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.showSpinningWheel(_:)), name: showSpinner, object: nil)
それから私はと呼ばれる機能を持っていた:
func showSpinningWheel(notification: NSNotification) {
}
私はそれを呼び出したいと思ったときはいつでも私はやっていました:
NSNotificationCenter.defaultCenter().postNotificationName(hideSpinner, object: self)
それでは、どうやったらオブジェクトmessageInfo
を渡して、それを呼び出される関数に含めることができますか?
Swift 2.
[NSObject:AnyObject]型のオプションのDictionaryである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
func showSpinningWheel(_ notification: NSNotification) {
if let image = notification.userInfo?["image"] as? UIImage {
// do something with your image
}
}
NOTE: Notification“ names”はもはや文字列ではなく、Notification.Name型なので、NSNotification.Name(rawValue:"notificationName")
を使っているので、独自のカスタム通知でNotification.Nameを拡張できます。
extension Notification.Name {
static let myNotification = Notification.Name("myNotification")
}
// and post notification like this
NotificationCenter.default.post(name: .myNotification, object: nil)
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
}
}
}
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
}
}
}
こんにちは@sahil私は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
}
}
}
お役に立てば幸いです。ありがとう
let dictionary = self.convertStringToDictionary(respondceString)
NotificationCenter.default.post(名前:NSNotification.Name(rawValue: "SOCKET_UPDATE")、オブジェクト:辞書)
Swift 4.2では、NSNotificationを使ってコードの表示と非表示を切り替えるために次のコードを使用しました。
@objc func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo? [UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
let keyboardheight = keyboardSize.height
print(keyboardheight)
}
}