Làm cách nào để chuyển dữ liệu bằng NotificationCenter trong phiên bản nhanh 3.0 và NSNotificationCenter trong phiên bản nhanh chóng 2.0?


122

Tôi đang triển khai socket.iotrong ứng dụng iOS nhanh chóng của mình.

Hiện tại trên một số bảng, tôi đang nghe máy chủ và chờ tin nhắn đến. Tôi đang làm như vậy bằng cách gọi getChatMessagehàm trong mỗi bảng:

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

Tuy nhiên, tôi nhận thấy đó là một cách tiếp cận sai và tôi cần phải thay đổi nó - bây giờ tôi muốn bắt đầu nghe tin nhắn đến chỉ một lần và khi bất kỳ tin nhắn nào đến - hãy chuyển thông báo này đến bất kỳ bảng điều khiển nào lắng nghe nó.

Vì vậy, tôi muốn chuyển tin nhắn đến qua NSNotificationCenter. Cho đến nay, tôi đã có thể chuyển thông tin rằng điều gì đó đã xảy ra, nhưng không thể truyền dữ liệu của chính nó. Tôi đã làm điều đó bằng cách:

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

thì tôi đã có một hàm được gọi là:

func showSpinningWheel(notification: NSNotification) {
}

và bất cứ lúc nào tôi muốn gọi nó là tôi đã làm:

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

Vì vậy, làm thế nào tôi có thể truyền đối tượng messageInfovà bao gồm nó trong hàm được gọi?


2
sử dụng phương pháp với userinfo ...NSNotificationCenter.defaultCenter().postNotificationName("hideSpinner", object: nil, userInfo: yourvalue)
EI Captain v2.0

hm ok, và làm cách nào tôi có thể tìm nạp cái này yourValuetrong hàm được gọi trên thông báo đó (trong showSpinningWheel)?
user3766930

sử dụng .userinfolike notification.userinfo
EI Captain v2.0

Câu trả lời:


277

Swift 2.0

Chuyển thông tin bằng cách sử dụng userInfoloại Từ điển tùy chọn [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   
  }
 }

Phiên bản Swift 3.0 trở lên

Người dùngInfo bây giờ lấy [AnyHashable: Any]? như một đối số, mà chúng tôi cung cấp dưới dạng một từ điển trong 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
 // For swift 4.0 and above put @objc attribute in front of function Definition  
 func showSpinningWheel(_ notification: NSNotification) {

  if let image = notification.userInfo?["image"] as? UIImage {
  // do something with your image   
  }
 }

LƯU Ý: “Tên” thông báo không còn là chuỗi nữa mà thuộc loại Notification.Name, do đó chúng tôi đang sử dụng NSNotification.Name(rawValue:"notificationName")và chúng tôi có thể mở rộng Notification.Name bằng các thông báo tùy chỉnh của riêng mình.

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

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

46

Đối với 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
            }
        }
 }

Đối với Swift 4

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
            }
        }
 }

1
Làm việc cho tôi Swift 4
Ravi

20

Xin chào @sahil Tôi cập nhật câu trả lời của bạn cho nhanh 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
            }
        }
 }

Hy vọng nó hữu ích. Cảm ơn


3
nên notification.userinfo, không notification.object
Pak Cheung Ho

1
Nếu bạn đang nhận đối tượng / từ điển từ lớp / thông báo mục tiêu-c, bạn phải sử dụng .object. Nếu bạn đang nhận đối tượng từ thông báo Swift, hãy sử dụng .userInfo. Theo dõi thông báo của bạn nếu đó là .object hoặc .userInfo với: func ObserverNotification (thông báo: NSNotification) {print ("Thông báo đã nhận:", thông báo)}
Doci

Đảm bảo nếu bạn đang gửi qua các chuỗi mà bạn đã thiết lập trình quan sát trên khóa đó trước khi đăng lên khóa thông báo đó. Bạn có thể quen thuộc hơn với trình nghe thuật ngữ và sự kiện.
Aaron

2

đây là cách tôi thực hiện nó.

let dictionary = self.convertStringToDictionary(responceString)            
     NotificationCenter.default.post(name: NSNotification.Name(rawValue: "SOCKET_UPDATE"), object: dictionary)

0

Trong phiên bản nhanh chóng 4.2, tôi đã sử dụng mã sau để hiển thị và ẩn mã bằng cách sử dụng NSNotification

 @objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo? [UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        let keyboardheight = keyboardSize.height
        print(keyboardheight)
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.