web-dev-qa-db-fra.com

Comment transmettre des données à l'aide de NotificationCenter dans Swift 3.0 et de NSNotificationCenter dans Swift 2.0?

J'implémente socket.io dans mon application Swift ios.

Actuellement sur plusieurs panneaux, j'écoute le serveur et attend les messages entrants. Je le fais en appelant la fonction getChatMessage dans chaque panneau:

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

Cependant, j’ai remarqué que c’était une mauvaise approche et que je devais la modifier - maintenant, je veux commencer à écouter les messages entrants une seule fois et quand un message arrive - transmettez ce message à n’importe quel panneau qui l’écoute.

Je souhaite donc transmettre le message entrant via NSNotificationCenter. Jusqu'à présent, j'ai pu transmettre l'information selon laquelle quelque chose s'était passé, mais pas transmettre les données elles-mêmes. Je faisais ça par:

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

alors j'ai eu une fonction appelée:

func showSpinningWheel(notification: NSNotification) {
}

et chaque fois que je voulais l'appeler, je le faisais:

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

Alors, comment puis-je passer l'objet messageInfo et l'inclure dans la fonction appelée?

100
user3766930

Swift 2.

Passer les informations en utilisant userInfo qui est un dictionnaire facultatif de type [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   
  }
 }

version Swift 3.

Le userInfo prend maintenant [AnyHashable: Any]? comme argument, que nous fournissons sous forme de dictionnaire dans 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
 func showSpinningWheel(_ notification: NSNotification) {

  if let image = notification.userInfo?["image"] as? UIImage {
  // do something with your image   
  }
 }

NOTE: Les "noms" de notification ne sont plus des chaînes, mais sont du type Notification.Name, d'où la raison pour laquelle nous utilisons NSNotification.Name(rawValue:"notificationName") et nous pouvons étendre Notification.Name avec nos propres notifications personnalisées.

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

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

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

Pour 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
            }
        }
 }
30
Sachin Rasane

Bonjour @sahil, je mets à jour votre réponse pour 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
            }
        }
 }

J'espère que c'est utile. Merci

15
Ilesh

let dictionary = self.convertStringToDictionary (responceString)
NotificationCenter.default.post (nom: NSNotification.Name (rawValue: "SOCKET_UPDATE"), objet: dictionnaire)

1
Nitin

Dans Swift 4.2, j'ai utilisé le code suivant pour afficher et masquer le code à l'aide de NSNotification.

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