Wie übergebe ich Daten mit NotificationCenter in Swift 3.0 und NSNotificationCenter in Swift 2.0?


121

Ich implementiere socket.ioin meiner schnellen iOS-App.

Derzeit höre ich auf mehreren Panels den Server und warte auf eingehende Nachrichten. Ich rufe dazu die getChatMessageFunktion in jedem Panel auf:

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

Ich habe jedoch festgestellt, dass dies ein falscher Ansatz ist, und ich muss ihn ändern. Jetzt möchte ich nur noch einmal auf eingehende Nachrichten warten und diese Nachricht an jedes Panel weiterleiten, das sie abhört.

Daher möchte ich die eingehende Nachricht über das NSNotificationCenter weiterleiten. Bisher konnte ich die Information weitergeben, dass etwas passiert ist, aber nicht die Daten selbst weitergeben. Ich habe das gemacht von:

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

dann hatte ich eine Funktion namens:

func showSpinningWheel(notification: NSNotification) {
}

und jedes Mal, wenn ich es nennen wollte, tat ich:

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

Wie kann ich das Objekt übergeben messageInfound in die aufgerufene Funktion aufnehmen?


2
Methode mit Benutzerinfo verwenden ...NSNotificationCenter.defaultCenter().postNotificationName("hideSpinner", object: nil, userInfo: yourvalue)
EI Captain v2.0

hm ok, und wie kann ich das yourValuein der Funktion abrufen, die bei dieser Benachrichtigung (in showSpinningWheel) aufgerufen wird ?
user3766930

mit .userinfolike notification.userinfo
EI Captain v2.0

Antworten:


274

Swift 2.0

userInfoÜbergeben Sie Informationen mit einem optionalen Wörterbuch vom Typ [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 Version und höher

Die userInfo nimmt jetzt [AnyHashable: Any]? als Argument, das wir in Swift als Wörterbuchliteral bereitstellen

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

HINWEIS: Benachrichtigungsnamen sind keine Zeichenfolgen mehr, sondern vom Typ Notification.Name. Daher verwenden wir NSNotification.Name(rawValue:"notificationName")Notification.Name und können Notification.Name um unsere eigenen benutzerdefinierten Benachrichtigungen erweitern.

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

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

45

Für 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
            }
        }
 }

Für 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
Arbeitete für mich Swift 4
Ravi

19

Hallo @sahil, ich aktualisiere deine Antwort für 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
            }
        }
 }

Hoffe es ist hilfreich. Vielen Dank


3
sollte Benachrichtigung sein.userinfo, nicht Benachrichtigung.Objekt
Pak Ho Cheung

1
Wenn Sie ein Objekt / Wörterbuch von der Objective-C-Klasse / Benachrichtigung erhalten, müssen Sie .object verwenden. Wenn Sie ein Objekt von einer Swift-Benachrichtigung erhalten, verwenden Sie .userInfo. Verfolgen Sie Ihre Benachrichtigung, wenn es sich um .object oder .userInfo handelt, mit: func ObserverNotification (Benachrichtigung: NSNotification) {print ("Benachrichtigung erhalten:", Benachrichtigung)}
Doci

Stellen Sie beim Senden über Threads sicher, dass Sie den Beobachter für diesen Schlüssel eingerichtet haben, bevor Sie an diesen Benachrichtigungsschlüssel senden. Möglicherweise kennen Sie die Begriffe Listener und Event besser.
Aaron

2

So implementiere ich es.

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

0

In Swift 4.2 habe ich folgenden Code verwendet, um Code mithilfe von NSNotification anzuzeigen und auszublenden

 @objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo? [UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        let keyboardheight = keyboardSize.height
        print(keyboardheight)
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.