ในการเขียนโค้ดโปรแกรม เทคนิคการใส่ function เพื่อให้สามารถเรียกใช้ได้อย่าง callback นั้นเป็นเทคนิคที่ได้รับความนิยมพอตัว และมีการเปิดให้ใช้งานในหลายๆ ภาษาโปรแกรม ที่รู้จักกันดีน่าจะเป็น JavaScript และใน Swift ก็มีให้ใช้เช่นกัน
ใน Swift เราสามารถเรียกเทคนิคนี้ว่าการสร้าง callback handler หรือ completion handler ก็ได้
การทำงานของ Callback/completion handler
completion handler มักจะอยู่ในรูปแบบของ function ที่ส่งเข้ามาเพื่อเรียกใช้งานตอนสิ้นสุดการทำงานของ function นั้นๆ
ลองนึกถึงสายลับที่ได้รับกระเป๋าที่ต้องกดปุ่มด้านในเพื่อยืนยันว่าภารกิจเสร็จสมบูรณ์ก็ได้ครับ
ยกตัวอย่างเช่นเรามีการสร้าง function ที่จะมีการขอข้อมูลจาก Web API ชื่อ loadWebAPIData
ซึ่งตรงจุดหนึ่งของการทำงานเราสามารถเรียกใช้ function ที่ชื่อว่า callOnCompletion
ได้ ซึ่งในที่นี้เรากำหนดว่าให้ตัว completion รับค่า bool เป็น parameter ครับ
func loadWebAPIData(endpointURL:String, callInCompletion: (Bool)->()){
if(endpointURL.count > 0) {
// call web api
callInCompletion(true)
} else {
callInCompletion(false)
}
}
- ซึ่งจากการเขียนการทำงานของ function ด้านบนนี้จะเห็นว่า เรามีการเรียกใช้
callOnCompletion
โดยใส่ค่า true หากค่า endpointURL ไม่ใช่ข้อความเปล่าๆ และอาจจะมีการติดต่อกับ Web API ตามปกติ - ในทางกลับกัน ถ้า endpointURL เป็นข้อความเปล่าๆ เราจะเรียกใช้
callInCompletion
เพียงแต่เราจะส่งค่า false ให้แทน - หากมีการเรียกใช้
loadWebAPIData
จริงๆ เราสามารถเขียน completion handler ได้แบบด้านล่าง
// แบบที่ 1
loadWebAPIData(endpointURL: "") { (result)->() in
print(result)
}
// แบบที่ 2
loadWebAPIData(endpointURL: "") { result in
print(result)
}
- ซึ่งในการใช้งานจริงนี้ จะเห็นว่าเราเรียกใช้
loadWebAPIData
โดยส่งค่า endpointURL ลงไปเป็นข้อความว่างๆ - และเราสามารถเขียน completion handler ต่อท้าย โดยการใช้วิธีการทั้งแบบที่ 1 และแบบที่ 2 ก็ได้
- สังเกตว่าค่าที่ได้ในตัวแปร result ของ handler คือค่าที่ส่งผ่านมาจากการเรียกใช้ completion handler ภายในตัว function
loadWebAPIData
อ้างอิง – StackOverflow