मैं स्विफ्ट में एक पूर्ण हैंडलर के साथ एक समारोह कैसे बना सकता हूं?


116

मैं बस इस बात के लिए उत्सुक था कि मैं यह कैसे करूंगा। यदि मेरे पास कोई फ़ंक्शन था, और मैं चाहता था कि जब यह पूरी तरह से निष्पादित हो जाए, तो मैं इसे फ़ंक्शन में कैसे जोड़ूंगा? धन्यवाद


2
Youtube पर एक अद्भुत वीडियो है: google.com/…
उज्ज्वल भविष्य

जवाबों:


174

मान लें कि आपके पास नेटवर्क से फ़ाइल डाउनलोड करने के लिए एक डाउनलोड फ़ंक्शन है, और डाउनलोड कार्य समाप्त होने पर सूचित किया जाना चाहिए।

typealias CompletionHandler = (success:Bool) -> Void

func downloadFileFromURL(url: NSURL,completionHandler: CompletionHandler) {

    // download code.

    let flag = true // true if download succeed,false otherwise

    completionHandler(success: flag)
}

// How to use it.

downloadFileFromURL(NSURL(string: "url_str")!, { (success) -> Void in

    // When download completes,control flow goes here.
    if success {
        // download success
    } else {
        // download fail
    }
})

आशा करता हूँ की ये काम करेगा।


2
यह बहुत अच्छा काम करेगा, लेकिन जिज्ञासा से अधिक, मैं सोच रहा था कि क्या आप किसी तरह अपने काम में एक पूरा हैंडलर लिख सकते हैं।
traw1233

1
हाय फ्लक्स, मैं इस फंक्शनलहैंडलर को अन्य फ़ंक्शन से कॉल करना चाहता हूं ताकि इसे कैसे प्राप्त किया जाए ??
हिमांशु जामनानी

उद्देश्य c
Xcodian Solangi

जब मैं इसे किसी अन्य वर्ग द्वारा कहता हूं तो यह पूर्ण हैंडलर सफलता पैरामीटर की बुवाई नहीं करता है।
चांदनी

85

मुझे उत्तरों को समझने में परेशानी हुई, इसलिए मैं किसी अन्य शुरुआती को मान रहा हूं कि मेरे जैसा ही समस्या हो सकता है।

मेरा समाधान शीर्ष उत्तर के रूप में ही करता है, लेकिन उम्मीद है कि शुरुआती या लोगों के लिए सामान्य रूप से समझने में परेशानी के लिए थोड़ा और अधिक स्पष्ट और आसान है।

एक पूरा हैंडलर के साथ एक फ़ंक्शन बनाने के लिए

func yourFunctionName(finished: () -> Void) {

     print("Doing something!")

     finished()

}

फ़ंक्शन का उपयोग करने के लिए

     override func viewDidLoad() {

          yourFunctionName {

          //do something here after running your function
           print("Tada!!!!")
          }

    }

आपका आउटपुट होगा

कुछ कर रही है

टाडा !!!

उम्मीद है की यह मदद करेगा!


80

सरल स्विफ्ट 4.0 उदाहरण:

func method(arg: Bool, completion: (Bool) -> ()) {
    print("First line of code executed")
    // do stuff here to determine what you want to "send back".
    // we are just sending the Boolean value that was sent in "back"
    completion(arg)
}

इसे कैसे उपयोग करे:

method(arg: true, completion: { (success) -> Void in
    print("Second line of code executed")
    if success { // this will be equal to whatever value is set in this method call
          print("true")
    } else {
         print("false")
    }
})

12

हम इस उद्देश्य के लिए क्लोजर का उपयोग कर सकते हैं । निम्नलिखित प्रयास करें

func loadHealthCareList(completionClosure: (indexes: NSMutableArray)-> ()) {
      //some code here
      completionClosure(indexes: list)
}

कुछ बिंदु पर हम इस फ़ंक्शन को नीचे दिए गए अनुसार कह सकते हैं।

healthIndexManager.loadHealthCareList { (indexes) -> () in
            print(indexes)
}

कृपया क्लोजर से संबंधित अधिक जानकारी के लिए निम्न लिंक देखें ।

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html


5

स्विफ्ट 5.0 +, सिंपल और शॉर्ट

उदाहरण:

शैली 1

    func methodName(completionBlock: () -> Void)  {

          print("block_Completion")
          completionBlock()
    }

शैली २

    func methodName(completionBlock: () -> ())  {

        print("block_Completion")
        completionBlock()
    }

उपयोग:

    override func viewDidLoad() {
        super.viewDidLoad()
        
        methodName {

            print("Doing something after Block_Completion!!")
        }
    }

उत्पादन

block_Completion

Block_Completion के बाद कुछ करना !!


0

मैं कस्टम मेड पूरा करने वाले हैंडलर के बारे में थोड़ा भ्रमित हूं। आपके उदाहरण में:

मान लें कि आपके पास नेटवर्क से फ़ाइल डाउनलोड करने के लिए एक डाउनलोड फ़ंक्शन है, और डाउनलोड कार्य समाप्त होने पर सूचित किया जाना चाहिए।

typealias CompletionHandler = (success:Bool) -> Void

func downloadFileFromURL(url: NSURL,completionHandler: CompletionHandler) {

    // download code.

    let flag = true // true if download succeed,false otherwise

    completionHandler(success: flag)
}

आपका // download codeअभी भी अतुल्यकालिक रूप से भाग जाएगा। कोड सीधे आपके पास क्यों नहीं जाएगा let flag = trueऔर completion Handler(success: flag)आपके डाउनलोड कोड के समाप्त होने की प्रतीक्षा किए बिना?


आखिरकार, कुछ को बैठना पड़ता है और कोड को चलाने के लिए इंतजार करना पड़ता है, यह सभी तरह के अतुल्यकालिक हाथियों का विशाल टॉवर नहीं है। "रॉन एसिंक्रोनसली" का मतलब है कि दो धागे हैं। उनमें से एक बैठता है और कार्य के पूरा होने की प्रतीक्षा करता है, दूसरा काम करता है और नहीं करता है। पूरा करने वाले हैंडलर को बुलाया जाता है, या कम से कम उस थ्रेड के अंत में बुलाया जाता है, जो काम करता है।
क्राउन

0

उपरोक्त के अलावा: ट्रेलिंग क्लोजर का उपयोग किया जा सकता है।

downloadFileFromURL(NSURL(string: "url_str")!)  { (success) -> Void in

  // When download completes,control flow goes here.
  if success {
      // download success
  } else {
    // download fail
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.