Wdrażam socket.io
w mojej szybkiej aplikacji na iOS.
Obecnie na kilku panelach słucham serwera i czekam na przychodzące wiadomości. Robię to, wywołując getChatMessage
funkcję w każdym panelu:
func getChatMessage(){
SocketIOManager.sharedInstance.getChatMessage { (messageInfo) -> Void in
dispatch_async(dispatch_get_main_queue(), { () -> Void in
//do sth depending on which panel user is
})
}
}
Zauważyłem jednak, że jest to złe podejście i muszę to zmienić - teraz chcę zacząć nasłuchiwać przychodzących wiadomości tylko raz, a gdy nadejdzie jakakolwiek wiadomość - przekaż tę wiadomość do dowolnego panelu, który jej nasłuchuje.
Dlatego chcę przekazać przychodzącą wiadomość przez NSNotificationCenter. Do tej pory udało mi się przekazać informację, że coś się stało, ale nie przekazałem samych danych. Robiłem to poprzez:
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.showSpinningWheel(_:)), name: showSpinner, object: nil)
wtedy miałem funkcję o nazwie:
func showSpinningWheel(notification: NSNotification) {
}
i za każdym razem, gdy chciałem to nazwać, robiłem:
NSNotificationCenter.defaultCenter().postNotificationName(hideSpinner, object: self)
Jak więc mogę przekazać obiekt messageInfo
i dołączyć go do wywoływanej funkcji?
źródło
NSNotificationCenter.defaultCenter().postNotificationName("hideSpinner", object: nil, userInfo: yourvalue)
yourValue
w funkcji, która jest wywoływana w tym powiadomieniu (wshowSpinningWheel
)?.userinfo
notification.userinfo
Odpowiedzi:
Swift 2.0
Przekaż informacje, używając
userInfo
opcjonalnego słownika typu [NSObject: AnyObject]?Wersja Swift 3.0 i nowsze
Informacje o użytkowniku zajmują teraz [AnyHashable: Any]? jako argument, który podajemy jako literał słownikowy w języku Swift
UWAGA: „Nazwy” powiadomień nie są już ciągami, ale są typu Notification.Name, stąd dlaczego używamy
NSNotification.Name(rawValue:"notificationName")
i możemy rozszerzyć Notification.Name o nasze własne niestandardowe powiadomienia.źródło
Dla Swift 3
Dla Swift 4
źródło
Cześć @sahil, zaktualizuję twoją odpowiedź na Swift 3
Mam nadzieję, że to pomocne. Dzięki
źródło
tak to wdrażam.
źródło
W swift 4.2 użyłem następującego kodu, aby pokazać i ukryć kod za pomocą NSNotification
źródło