2016-04-28 11 views
55

Wdrażam aplikację socket.io w mojej szybkiej aplikacji ios.Jak przekazywać dane za pomocą NotificationCentre w swift 3.0 i NSNotificationCenter w swift 2.0?

Obecnie na kilku panelach słucham serwera i czekam na wiadomości przychodzące. Robię to poprzez wywołanie funkcji w każdym panelu getChatMessage:

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

Jednak zauważyłem, że jest to złe podejście i muszę go zmienić - teraz chcę zacząć słuchać wiadomości przychodzących tylko raz, kiedy każdą wiadomość przychodzi - przekazuje tę wiadomość do dowolnego panelu, który ją odsłuchuje.

Więc chcę przekazać wiadomość przychodzącą za pośrednictwem NSNotificationCenter. Do tej pory udało mi się przekazać informację, że coś się stało, ale nie przekazać samych danych. Robiłem to przez:

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

Wtedy miałem funkcję o nazwie:

func showSpinningWheel(notification: NSNotification) { 
} 

i wszelkie razem chciałem nazwać to robiłem:

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

więc jak mogę przekazać obiekt messageInfo i dołączyć go do funkcji, która zostanie wywołana?

+1

użyj metody z userinfo ... 'NSNotificationCenter.defaultCenter(). PostNotificationName (" hideSpinner ", object: nil, userInfo: yourvalue)' –

+0

hm ok, i jak mogę pobrać tę 'twoją wartość' w funkcji, która zostanie wywołany w tym powiadomieniu (w 'showSpinningWheel')? – user3766930

+0

przy użyciu '.userinfo' jak' notification.userinfo' –

Odpowiedz

149

Swift 2,0

informacji karnetów używając userInfo który jest opcjonalny Słownik typu [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 wersja

userinfo trwa teraz [AnyHashable: Wszelkie]? jako argument, który oferujemy jako dosłowne w słowniku 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 
    } 
} 

UWAGA: „nazwiska” Powiadomienie nie są łańcuchami, ale są typu Notification.Name, więc dlaczego używamy NSNotification.Name(rawValue:"notificationName") i możemy przedłużyć Notification.Name z naszymi własnymi powiadomieniami niestandardowymi.

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

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

Gosh to jest tak skomplikowane – MarksCode

+6

@MarksCode, nie jest, zaufaj mi :) jak tylko zaimplementujesz to zobaczysz jak prosty jest ten kod i będzie się śmiać :)) – mimic

+0

Jak to działa? zmieszany. Nierozwiązany identyfikator. – HamasN

6

Witam @sahil zaktualizować swoją odpowiedź dla szybkiej 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 
      } 
     } 
} 

nadzieję, że pomocne. Dzięki

+0

już to zrobiłem w październiku 2016. – Sahil

+3

powinien być powiadomienie.userinfo, not notification.object –

Powiązane problemy