स्विफ्ट 3.0 में नोटिफिकेशनकेंटर और स्विफ्ट 2.0 में NSNotificationCenter का उपयोग करके डेटा कैसे पास करें?


122

मैं socket.ioअपने स्विफ्ट आईओएस ऐप में लागू कर रहा हूं ।

वर्तमान में कई पैनलों पर मैं सर्वर को सुन रहा हूं और आने वाले संदेशों की प्रतीक्षा कर रहा हूं। मैं 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
उपयोग विधि userinfo के साथ ...NSNotificationCenter.defaultCenter().postNotificationName("hideSpinner", object: nil, userInfo: yourvalue)
EI कप्तान v2.0

हम्म ठीक है, और मैं इसे yourValueउस फ़ंक्शन में कैसे ला सकता हूं जिसे उस अधिसूचना ( showSpinningWheel) में कहा जाता है ?
user3766930

.userinfoजैसे उपयोग करनाnotification.userinfo
EI Captain v2.0

जवाबों:


277

स्विफ्ट 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   
  }
 }

3.0 संस्करण और ऊपर स्विफ्ट

UserInfo अब [AnyHashable: Any] लेता है? एक तर्क के रूप में, जिसे हम स्विफ्ट में एक शब्दकोश शाब्दिक के रूप में प्रदान करते हैं

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

नोट: अधिसूचना "नाम" अब तार नहीं हैं, लेकिन नोटिफिकेशन प्रकार के हैं। इसलिए, हम क्यों उपयोग कर रहे हैं NSNotification.Name(rawValue:"notificationName")और हम अपनी स्वयं की कस्टम सूचनाओं के साथ अधिसूचना का नाम बदल सकते हैं।

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

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

46

स्विफ्ट 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
            }
        }
 }

स्विफ्ट 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
मेरे लिए स्विफ्ट 4
रवि

20

नमस्कार @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
            }
        }
 }

आशा है कि यह उपयोगी है। धन्यवाद


3
नोटिफिकेशन होना चाहिए। नोटेरिनो, नोटिफिकेशन नहीं। नोट
पाक हो चेउंग

1
यदि आप उद्देश्य-सी वर्ग / अधिसूचना से ऑब्जेक्ट / शब्दकोश प्राप्त कर रहे हैं तो आपको .object का उपयोग करना चाहिए। यदि आप स्विफ्ट अधिसूचना उपयोग .userInfo से ऑब्जेक्ट प्राप्त कर रहे हैं। यदि यह है तो आप सूचना को ट्रैक करें। इसके साथ .object या .userInfo: func observerNotification (अधिसूचना: NSNotification) {प्रिंट ("अधिसूचना प्राप्त:", अधिसूचना)}
Doci

सुनिश्चित करें कि यदि आप थ्रेड भर भेज रहे हैं कि आप उस अधिसूचना कुंजी पर पोस्ट करने से पहले उस कुंजी पर पर्यवेक्षक सेट करें। आप श्रोता और घटना से अधिक परिचित हो सकते हैं।
हारून

2

मैं इसे लागू करता हूं।

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

0

स्विफ्ट 4.2 में मैंने NSNotification का उपयोग करके कोड दिखाने और छिपाने के लिए निम्नलिखित कोड का उपयोग किया

 @objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo? [UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        let keyboardheight = keyboardSize.height
        print(keyboardheight)
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.