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?
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)
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
}
}
}
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
}
}
}
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
let dictionary = self.convertStringToDictionary (responceString)
NotificationCenter.default.post (nom: NSNotification.Name (rawValue: "SOCKET_UPDATE"), objet: dictionnaire)
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)
}
}