จะส่งผ่านข้อมูลโดยใช้ NotificationCenter ใน swift 3.0 และ NSNotificationCenter ใน swift 2.0 ได้อย่างไร


122

ฉันกำลังใช้งานsocket.ioในแอพ iOS ที่รวดเร็วของฉัน

ขณะนี้อยู่ในแผงควบคุมหลายแผงฉันกำลังฟังเซิร์ฟเวอร์และรอข้อความเข้า ฉันกำลังเรียกใช้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และรวมไว้ในฟังก์ชันที่เรียกได้อย่างไร


2
ใช้ method กับ userinfo ...NSNotificationCenter.defaultCenter().postNotificationName("hideSpinner", object: nil, userInfo: yourvalue)
EI Captain v2.0

อืมตกลงและฉันจะดึงสิ่งนี้yourValueในฟังก์ชันที่เรียกใช้การแจ้งเตือนนั้น (ในshowSpinningWheel) ได้อย่างไร
user3766930

ใช้.userinfoเช่น notification.userinfo
EI กัปตัน v2.0

คำตอบ:


277

Swift 2.0

ส่งผ่านข้อมูลโดยใช้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: Any] หรือไม่ เป็นอาร์กิวเมนต์ซึ่งเราจัดให้เป็นตัวอักษรพจนานุกรมใน 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   
  }
 }

หมายเหตุ: การแจ้งเตือน“ ชื่อ” ไม่ใช่สตริงอีกต่อไป แต่เป็นประเภท 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)

46

สำหรับ 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
            }
        }
 }

สำหรับ 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
ทำงานให้ฉัน Swift 4
ราวี

20

สวัสดี @sahil ฉันอัปเดตคำตอบของคุณสำหรับ 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
            }
        }
 }

หวังว่าจะเป็นประโยชน์ ขอบคุณ


3
ควรจะเป็น Notification.userinfo ไม่ใช่การแจ้งเตือน
วัตถุ

1
หากคุณได้รับวัตถุ / พจนานุกรมจากคลาส object-c / การแจ้งเตือนคุณต้องใช้. object หากคุณได้รับวัตถุจากการแจ้งเตือน Swift ให้ใช้. userInfo ติดตามการแจ้งเตือนว่าเป็น. วัตถุหรือ. userInfo ด้วย: func observerNotification (การแจ้งเตือน: NSNotification) {พิมพ์ ("ได้รับการแจ้งเตือน:", การแจ้งเตือน)}
Doci

ตรวจสอบให้แน่ใจว่าคุณกำลังส่งข้ามเธรดที่คุณตั้งค่าผู้สังเกตการณ์บนคีย์นั้นก่อนที่คุณจะโพสต์ไปยังคีย์การแจ้งเตือนนั้น คุณอาจคุ้นเคยกับคำศัพท์และเหตุการณ์
Aaron

2

นี่คือวิธีที่ฉันนำไปใช้

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

0

ใน Swift 4.2 ฉันใช้รหัสต่อไปนี้เพื่อแสดงและซ่อนรหัสโดยใช้ NSNotification

 @objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo? [UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        let keyboardheight = keyboardSize.height
        print(keyboardheight)
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.