swift 3.0のNotificationCenterとswift 2.0のNSNotificationCenterを使用してデータを渡す方法は?


122

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
        })
    }
}

しかし、私はそれが間違ったアプローチであることに気づき、それを変更する必要があります-着信メッセージのリッスンを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呼び出される関数に含めるにはどうすればよいですか?


2
userinfoでメソッドを使用する...NSNotificationCenter.defaultCenter().postNotificationName("hideSpinner", object: nil, userInfo: yourvalue)
EIキャプテンv2.0

じゃあyourValue、通知で呼び出される関数でこれをフェッチするにはどうすればよいshowSpinningWheelですか?
user3766930

.userinfolikeの 使用notification.userinfo
EIキャプテンv2.0

回答:


277

Swift 2.0

userInfoタイプ[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バージョン以降

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を独自のカスタム通知で拡張できます。

extension Notification.Name {
static let myNotification = Notification.Name("myNotification")
}

// and post notification like this
NotificationCenter.default.post(name: .myNotification, object: nil)

46

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
            }
        }
 }

Swift 4の場合

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
            }
        }
 }

1
私のために働いたSwift 4
Ravi

20

こんにちは@sahil私は迅速な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
            }
        }
 }

お役に立てば幸いです。ありがとう


3
notification.objectではなく、notification.userinfoである必要があります
Pak Ho Cheung

1
Objective-Cクラス/通知からオブジェクト/辞書を受け取っている場合は、.objectを使用する必要があります。Swift通知からオブジェクトを受け取っている場合は、.userInfoを使用します。func observerNotification(notification:NSNotification){print( "Notification Received:"、notification)}を使用して.objectまたは.userInfoである場合に通知を追跡する
Doci

その通知キーに投稿する前に、そのキーにオブザーバーを設定したスレッド間で送信しているかどうかを確認してください。リスナとイベントという用語をよく知っているかもしれません。
アーロン

2

これは私がそれを実装する方法です。

let dictionary = self.convertStringToDictionary(responceString)            
     NotificationCenter.default.post(name: NSNotification.Name(rawValue: "SOCKET_UPDATE"), object: dictionary)

0

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)
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.