Hızlı 3.0'da NotificationCenter ve hızlı 2.0'da NSNotificationCenter kullanılarak veri nasıl geçirilir?


122

socket.ioSwift ios uygulamamda uyguluyorum .

Şu anda birkaç panelde sunucuyu dinliyorum ve gelen mesajları bekliyorum. Bunu getChatMessage, her paneldeki işlevi çağırarak yapıyorum :

func getChatMessage(){
    SocketIOManager.sharedInstance.getChatMessage { (messageInfo) -> Void in
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            //do sth depending on which panel user is
        })
    }
}

Ancak bunun yanlış bir yaklaşım olduğunu fark ettim ve bunu değiştirmem gerekiyor - şimdi gelen mesajları yalnızca bir kez ve herhangi bir mesaj geldiğinde dinlemeye başlamak istiyorum - bu mesajı onu dinleyen herhangi bir panele iletin.

Bu yüzden gelen mesajı NSNotificationCenter aracılığıyla iletmek istiyorum. Şimdiye kadar bir şeyin olduğu bilgisini iletebildim, ancak verinin kendisini aktaramadım. Bunu şu şekilde yapıyordum:

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

sonra adında bir işlevim vardı:

func showSpinningWheel(notification: NSNotification) {
}

ve ne zaman aramak istesem, yapıyordum:

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

Peki nesneyi nasıl geçebilirim messageInfove çağrılan işleve nasıl dahil edebilirim ?


2
kullanıcı bilgisi ile yöntem kullanın ...NSNotificationCenter.defaultCenter().postNotificationName("hideSpinner", object: nil, userInfo: yourvalue)
EI Captain v2.0

hm ok, ve yourValuebu bildirimde çağrılan işlevde bunu nasıl getirebilirim (içinde showSpinningWheel)?
user3766930

.userinfobenzeri kullanaraknotification.userinfo
EI Kaptan v2.0

Yanıtlar:


277

Swift 2.0

Kullanarak bilgi iletin userInfo[: AnyObject NSObject] türünde bir isteğe bağlı sözlük olan?

  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 sürümü ve üstü

UserInfo şimdi [AnyHashable: Any] alıyor? Swift'de gerçek bir sözlük olarak sunduğumuz bir argüman olarak

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

NOT: Bildirim "adları" artık dizeler değil, Notification.Name türündedir, bu nedenle neden kullanıyoruz NSNotification.Name(rawValue:"notificationName")ve kendi özel bildirimlerimizle Notification.Name'i genişletebiliriz.

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

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

46

Swift 3 için

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 için

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
Benim için çalıştı Swift 4
Ravi

20

Merhaba @sahil, cevabınızı hızlı 3 için güncelliyorum

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

Umarım yardımcı olur. Teşekkürler


3
bildirim değil, notification.userinfo olmalıdır.
Pak Ho Cheung

1
Object-c sınıfından / bildiriminden nesne / sözlük alıyorsanız, .object kullanmalısınız. Swift bildiriminden nesne alıyorsanız .userInfo kullanın. .Object veya .userInfo ise bildiriminizi takip edin: func observerNotification (bildirim: NSNotification) {print ("Alındı ​​Bildirimi:", bildirim)}
Doci

Bu bildirim anahtarına göndermeden önce gözlemciyi o anahtarda kurduğunuz iş parçacıkları arasında gönderip göndermediğinizden emin olun. Dinleyici ve olay terimlerine daha aşina olabilirsiniz.
Aaron

2

Ben bunu böyle uyguluyorum.

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

0

Swift 4.2'de NSNotification kullanarak kodu göstermek ve gizlemek için aşağıdaki kodu kullandım

 @objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo? [UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        let keyboardheight = keyboardSize.height
        print(keyboardheight)
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.