Bagaimana cara melewatkan data menggunakan NotificationCenter di swift 3.0 dan NSNotificationCenter di swift 2.0?

122

Saya sedang menerapkan socket.io di aplikasi ios cepat saya.

Saat ini di beberapa panel saya mendengarkan server dan menunggu pesan masuk. Saya melakukannya dengan memanggil getChatMessagefungsi di setiap 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
        })
    }
}

Namun saya perhatikan itu adalah pendekatan yang salah dan saya perlu mengubahnya - sekarang saya ingin mulai mendengarkan pesan masuk hanya sekali dan ketika ada pesan datang - meneruskan pesan ini ke panel mana pun yang mendengarkannya.

Jadi saya ingin meneruskan pesan masuk melalui NSNotificationCenter. Sejauh ini saya dapat menyampaikan informasi bahwa sesuatu telah terjadi, tetapi tidak dapat meneruskan data itu sendiri. Saya melakukannya dengan:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.showSpinningWheel(_:)), name: showSpinner, object: nil)

lalu saya memiliki fungsi yang disebut:

func showSpinningWheel(notification: NSNotification) {
}

dan kapan pun saya ingin menyebutnya, saya melakukan:

NSNotificationCenter.defaultCenter().postNotificationName(hideSpinner, object: self)

Jadi bagaimana saya bisa melewatkan objek messageInfodan memasukkannya ke dalam fungsi yang dipanggil?

pengguna3766930
sumber
2
menggunakan metode dengan userinfo ...NSNotificationCenter.defaultCenter().postNotificationName("hideSpinner", object: nil, userInfo: yourvalue)
EI Captain v2.0
hm ok, dan bagaimana saya bisa mengambil ini yourValuedalam fungsi yang dipanggil pada notifikasi itu (dalam showSpinningWheel)?
pengguna3766930
menggunakan .userinfoseperti notification.userinfo
EI Captain v2.0

Jawaban:

277

Swift 2.0

Lewati info userInfoyang merupakan Dictionary opsional dari tipe [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   
  }
 }

Versi Swift 3.0 ke atas

UserInfo sekarang menggunakan [AnyHashable: Any]? sebagai argumen, yang kami sediakan sebagai kamus literal di 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   
  }
 }

CATATAN: “Nama” notifikasi tidak lagi berupa string, tetapi bertipe Notification.Name, oleh karena itu kami menggunakan NSNotification.Name(rawValue:"notificationName")dan kami dapat memperluas Notification.Name dengan notifikasi kustom kami sendiri.

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

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

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

Untuk 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
            }
        }
 }
Sachin Rasane
sumber
1
Bekerja untuk saya Swift 4
Ravi
20

Halo @sahil Saya memperbarui jawaban Anda untuk cepat 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
            }
        }
 }

Semoga bermanfaat. Terima kasih

Ilesh P.
sumber
3
harus notification.userinfo, bukan notification.object
Pak Ho Cheung
1
Jika Anda menerima objek / kamus dari kelas / notifikasi objektif-c, Anda harus menggunakan .object. Jika Anda menerima objek dari pemberitahuan Swift, gunakan .userInfo. Lacak notifikasi Anda jika itu .object atau .userInfo dengan: func observerNotification (notifikasi: NSNotification) {print ("Notification Received:", notification)}
Doci
Pastikan jika Anda mengirim lintas utas yang Anda atur pengamat pada kunci itu sebelum Anda memposting ke kunci notifikasi itu. Anda mungkin lebih akrab dengan istilah pendengar dan acara.
Aaron
2

inilah cara saya menerapkannya.

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

Dalam 4.2 cepat saya menggunakan kode berikut untuk menampilkan dan menyembunyikan kode menggunakan NSNotification

 @objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo? [UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        let keyboardheight = keyboardSize.height
        print(keyboardheight)
    }
}
Mohammad Muddasir
sumber