ฉันแค่อยากรู้ว่าฉันจะเข้าใกล้สิ่งนี้ได้อย่างไร ถ้าฉันมีฟังก์ชันและฉันต้องการให้บางอย่างเกิดขึ้นเมื่อมันถูกเรียกใช้งานอย่างสมบูรณ์ฉันจะเพิ่มสิ่งนี้ลงในฟังก์ชันได้อย่างไร ขอบคุณ
ฉันแค่อยากรู้ว่าฉันจะเข้าใกล้สิ่งนี้ได้อย่างไร ถ้าฉันมีฟังก์ชันและฉันต้องการให้บางอย่างเกิดขึ้นเมื่อมันถูกเรียกใช้งานอย่างสมบูรณ์ฉันจะเพิ่มสิ่งนี้ลงในฟังก์ชันได้อย่างไร ขอบคุณ
คำตอบ:
สมมติว่าคุณมีฟังก์ชันดาวน์โหลดเพื่อดาวน์โหลดไฟล์จากเครือข่ายและต้องการรับการแจ้งเตือนเมื่องานดาวน์โหลดเสร็จสิ้น
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!!!!")
}
}
ผลลัพธ์ของคุณจะเป็น
กำลังทำอะไรบางอย่าง
Tada !!!
หวังว่านี่จะช่วยได้!
ตัวอย่าง Simple Swift 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)
}
โปรดดูที่ลิงค์ต่อไปนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการปิด
Swift 5.0 + ง่ายและสั้น
ตัวอย่าง:
สไตล์ 1
func methodName(completionBlock: () -> Void) {
print("block_Completion")
completionBlock()
}
สไตล์ 2
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)
ไม่ต้องรอให้รหัสดาวน์โหลดของคุณเสร็จสิ้น
นอกเหนือจากด้านบน: สามารถใช้การปิดท้ายได้
downloadFileFromURL(NSURL(string: "url_str")!) { (success) -> Void in
// When download completes,control flow goes here.
if success {
// download success
} else {
// download fail
}
}