1. ホーム
  2. ios

[解決済み] swift 3.0のNotificationCenterとswift 2.0のNSNotificationCenterを使用してデータを渡すにはどうすればよいですか?

2022-05-07 17:33:10

質問

を実装しています。 socket.io を、iosアプリのSwiftに組み込んでいます。

現在、いくつかのパネルでサーバーをリッスンして、メッセージの着信を待っています。そのために 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 を呼び出し、呼び出される関数に含めることができますか?

どのように解決するのですか?

Swift 2.0

情報を渡すには userInfo は、[NSObject : AnyObject] 型のオプションの Dictionary ですか?

  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、4.0、5.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   
  }
 }

NOTE Notificationの「名前」は文字列ではなくなり、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)