2016-04-28 5 views
55

Я реализую socket.io в моем приложении быстрого ios.Как передавать данные с помощью NotificationCentre в swift 3.0 и NSNotificationCenter в swift 2.0?

В настоящее время на нескольких панелях я слушаю сервер и жду сообщений. Я делаю так, вызвав 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 
     }) 
    } 
} 

Однако я заметил, что это неправильный подход, и мне нужно изменить - теперь я хочу, чтобы начать прослушивание входящих сообщений только один раз, и когда любое сообщение приходит - передайте это сообщение на любую панель, которая его прослушивает.

Итак, я хочу передать входящее сообщение через NSNotificationCenter. До сих пор мне удалось передать информацию о том, что что-то произошло, но не передать данные. Я делал это с помощью:

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

тогда я имел функцию под названием:

func showSpinningWheel(notification: NSNotification) { 
} 

и в любое время я хотел назвать это я делаю:

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

Так как я могу передать объект messageInfo и включить его в функцию, вызываемую?

+1

использовать метод с userinfo ... 'NSNotificationCenter.defaultCenter(). PostNotificationName (" hideSpinner ", object: nil, userInfo: yourvalue)' –

+0

hm ok и как я могу получить этот 'yourValue' в функции, которая получает уведомление об этом уведомлении (в 'showSpinningWheel')? – user3766930

+0

используя '.userinfo' как' notification.userinfo' –

ответ

149

Swift 2,0

информация Pass с помощью userInfo, который является необязательным Словарь типа [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 версия

USERINFO теперь занимает [AnyHashable: Любой]? не в качестве аргумента, который мы предоставляем в качестве словаря буквальным в 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 
    } 
} 

ПРИМЕЧАНИЕ: Уведомление «имена» больше не строки, но имеют тип Notification.Name, следовательно, почему мы используем NSNotification.Name(rawValue:"notificationName") и мы можем Расширьте Notification.Name с помощью собственных пользовательских уведомлений.

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

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

Гош настолько сложный – MarksCode

+6

@MarksCode, это не так, поверьте мне :) как только вы его реализуете, вы увидите, насколько прост этот код и будет смеяться :)) – mimic

+0

How оно работает? смущенный. Неразрешенный идентификатор. – HamasN

6

Здравствуйте @sahil Я обновляю свой ответ на быстрые 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 
      } 
     } 
} 

Надеется, что это полезно. Спасибо

+0

Я уже сделал это в октябре 2016 года. – Sahil

+3

должно быть notification.userinfo, not notification.object –

Смежные вопросы