160 votes

Comment passer des données à l’aide de NotificationCenter dans NSNotificationCenter et swift 3.0 dans swift 2.0 ?

Je suis la mise en œuvre de socket.io dans ma swift application ios.

Actuellement sur plusieurs panneaux, je suis à l'écoute de serveur et d'attendre pour les messages entrants. Je suis en train de faire en appelant l' getChatMessage fonction de 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'est une mauvaise approche et j'ai besoin de le changer - maintenant, je veux commencer à écouter les messages entrants qu'une seule fois et lorsqu'un message arrive - passer ce message sur un panneau qu'elle l'écoute.

Donc, je veux passer le message entrant par le biais de la NSNotificationCenter. Jusqu'à présent, j'ai pu passer l'information que quelque chose s'est passé, mais de ne pas transmettre les données lui-même. Je faisais cela par:

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

ensuite, j'ai eu un appel de fonction:

func showSpinningWheel(notification: NSNotification) {
}

et tout le temps je voulais appeler ce que je faisais:

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

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

352voto

Sahil Points 6129

Swift 2.0

Passer l'info à l'aide de userInfo qui est une option Dictionnaire 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   
  }
 }

Swift version 3.0

Le userInfo prend maintenant [AnyHashable:Aucune? comme argument, qui nous offrent un dictionnaire littérale en 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   
  }
 }

REMARQUE: la Notification "noms" ne sont plus les cordes, mais le type de Notification.Nom, c'est pourquoi nous utilisons NSNotification.Name(rawValue:"notificationName") et nous pouvons étendre la Notification.Par nos propres noms des notifications personnalisées.

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

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

62voto

Sachin Rasane Points 113
<h2>Pour Swift 3<pre><code></code></pre><h2>Pour Swift 4</h2><pre><code></code></pre></h2>

22voto

ilesh Points 1765

Bonjour @sahil je mettre à jour votre réponse pour swift 3

Espère que c’est utile. Merci

3voto

Nitin Points 1

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X