2016-04-28 34 views
55

Sto implementando socket.io nella mia app ios rapida.Come passare i dati utilizzando NotificationCentre in swift 3.0 e NSNotificationCenter in swift 2.0?

Attualmente su più pannelli sto ascoltando il server e aspetto i messaggi in arrivo. Sto facendo in modo chiamando la funzione getChatMessage in ogni pannello:

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

Tuttavia ho notato che è un approccio sbagliato e ho bisogno di cambiarlo - ora voglio iniziare ad ascoltare per i messaggi in entrata solo una volta e quando un messaggio viene - passa questo messaggio a qualsiasi pannello che lo ascolta.

Quindi voglio passare il messaggio in arrivo attraverso NSNotificationCenter. Finora sono stato in grado di passare le informazioni che qualcosa è successo, ma non passare i dati stessi. Stavo facendo che:

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

poi ho avuto una funzione chiamata:

func showSpinningWheel(notification: NSNotification) { 
} 

e ogni volta ho voluto chiamarlo che stavo facendo:

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

Così come posso passare l'oggetto messageInfo e includerlo nella funzione che viene chiamata?

+1

utilizzare il metodo con userinfo ... 'NSNotificationCenter.defaultCenter(). PostNotificationName (" hideSpinner ", oggetto: nil, userInfo: yourvalue)' –

+0

hm ok, e come posso recuperare questo 'yourValue' nella funzione che viene chiamato su quella notifica (in 'showSpinningWheel')? – user3766930

+0

usando '.userinfo' come' notification.userinfo' –

risposta

149

Swift 2.0

informazioni Passo utilizzando userInfo che è un dizionario facoltativa di tipo [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 versione 3,0

L'userInfo prende ora [AnyHashable: Qualsiasi]? come argomento, che mettiamo a disposizione come un dizionario letterale 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 
    } 
} 

NOTA: “nomi” notifica non siamo più stringhe, ma sono di tipo Notification.Name, quindi, perché stiamo usando NSNotification.Name(rawValue:"notificationName") e possiamo estendere Notification.Name con le nostre notifiche personalizzate.

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

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

Gosh è così complicato – MarksCode

+6

@MarksCode, non è così, fidati di me :) non appena lo implementerai vedrai quanto sia semplice questo codice e riderai :)) – mimic

+0

Come Funziona? confuso. Identificatore non risolto – HamasN

6

Ciao @sahil posso aggiornare la vostra risposta rapida per 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 
      } 
     } 
} 

Spero che sia utile. Grazie

+0

L'ho già fatto nell'ottobre 2016. – Sahil

+3

dovrebbe essere notification.userinfo, not notification.object –