जवाबों:
मान लें कि आपके पास नेटवर्क से फ़ाइल डाउनलोड करने के लिए एक डाउनलोड फ़ंक्शन है, और डाउनलोड कार्य समाप्त होने पर सूचित किया जाना चाहिए।
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
}
})
आशा करता हूँ की ये काम करेगा।
मुझे उत्तरों को समझने में परेशानी हुई, इसलिए मैं किसी अन्य शुरुआती को मान रहा हूं कि मेरे जैसा ही समस्या हो सकता है।
मेरा समाधान शीर्ष उत्तर के रूप में ही करता है, लेकिन उम्मीद है कि शुरुआती या लोगों के लिए सामान्य रूप से समझने में परेशानी के लिए थोड़ा और अधिक स्पष्ट और आसान है।
एक पूरा हैंडलर के साथ एक फ़ंक्शन बनाने के लिए
func yourFunctionName(finished: () -> Void) {
print("Doing something!")
finished()
}
फ़ंक्शन का उपयोग करने के लिए
override func viewDidLoad() {
yourFunctionName {
//do something here after running your function
print("Tada!!!!")
}
}
आपका आउटपुट होगा
कुछ कर रही है
टाडा !!!
उम्मीद है की यह मदद करेगा!
सरल स्विफ्ट 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")
}
})
हम इस उद्देश्य के लिए क्लोजर का उपयोग कर सकते हैं । निम्नलिखित प्रयास करें
func loadHealthCareList(completionClosure: (indexes: NSMutableArray)-> ()) {
//some code here
completionClosure(indexes: list)
}
कुछ बिंदु पर हम इस फ़ंक्शन को नीचे दिए गए अनुसार कह सकते हैं।
healthIndexManager.loadHealthCareList { (indexes) -> () in
print(indexes)
}
कृपया क्लोजर से संबंधित अधिक जानकारी के लिए निम्न लिंक देखें ।
स्विफ्ट 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 के बाद कुछ करना !!
मैं कस्टम मेड पूरा करने वाले हैंडलर के बारे में थोड़ा भ्रमित हूं। आपके उदाहरण में:
मान लें कि आपके पास नेटवर्क से फ़ाइल डाउनलोड करने के लिए एक डाउनलोड फ़ंक्शन है, और डाउनलोड कार्य समाप्त होने पर सूचित किया जाना चाहिए।
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)
आपके डाउनलोड कोड के समाप्त होने की प्रतीक्षा किए बिना?