มาทำความรู้จักกับ Combine Framework กันเถอะ

Surachet Y.
CREATIVE ME
Published in
2 min readSep 30, 2020

ในงาน WWDC 2019 ทาง Apple ได้ประกาศตัว Framework ตัวใหม่มาก็คือ Combine Framework มีการทำงานในรูปแบบ Asynchronous โดยที่ทาง Apple’s ได้กล่าวไว้ว่า

“Combine framework ทำงานภายใต้การทำงานของแอพของคุณ ค่อนข้างที่จะเป็นทำให้สำเร็จภายใต้ delegate callbacks หลายตัว หรือ ทำงานภายใต้ closure. คุณสามารถสร้าง 1 process ที่ต่อกันส่งไปยังการทำงานที่ต้นทางได้. แต่ละส่วนของการเชื่อมถึงกันภายใต้ Combine operator จะดำเนินการภายใต้การกระทำที่ได้รับมาก่อนหน้า”

เจ้า Combine Framework ไม่ใช่คอนเซ็ปใหม่อะไร มันจะไปคล้ายคลึงกับ Reactive Programming หรือที่เรียกกันว่า Rx นั่นเอง คาดว่าเป็นแรงบรรดาลใจในการสร้าง Combine Framework ของทาง Apple เอง.

ซึ่ง Combine Framework มีคอนเซ็ปสำคัญที่ต้องทำความเข้าใจดังนี้ คือ

  • Publisher and Subscriber
  • Subject
  • Operator

Publisher & Subscriber

Publisher

เป็นตัวแปรประเภทหนึ่งที่จะคอยจัดการข้อมูลเมื่อพร้อมหรือมีการส่งค่ามา ถ้าหาก Publisher ไม่มีการทำ Subscription ก็จะไม่มีค่าอะไรส่งมา กล่าวคือ Publisher พูดเป็นภาษามนุษย์ให้เข้าใจง่ายคือ บริกรที่คอยบริการลูกค้า.

Subscriber

เป็นตัวแปรประเภทหนึ่งที่รับค่าจากข้อมูล เมื่อทำการรับค่ามาได้สำเร็จจะนำค่าที่ได้ไปทำกระบวนการบางอย่างต่อในรูปแบบ Asynchronous ผมจะเปรียบ Subscriber เสมือนพ่อครัวที่ทำอาหารให้กับลูกค้า.

เผื่อทุกคนไม่เข้าใจผมจะสรุป Publisher และ Subscriber โดยจะยกตัวอย่างเป็นในกรณีร้านอาหารแห่งหนึ่ง โดยที่ Subscriber เป็นพ่อครัวที่รับรายการอาหารมาเพื่อนำไปปรุง เมื่อปรุงสำเร็จก็จะทำการ Publisher หรือบริกรก็จะทำการ Subscribe หรือเดินไปรับอาหารเพื่อนำไปเสิร์ฟยังโต๊ะของลูกค้า.

มาดูตัวอย่างของ Publisher และ Subscriber กัน.

ในตัวอย่างโค้ด บริกรรับรายการอาหารมาจากลูกค้าแล้วจด แล้วส่งให้กับเชฟเพื่อทำการนำรายการอาหารไปปรุงต่อ เมื่อเชฟทำการปรุงอาหารเสร็จให้ทำการปริ้นชื่ออาหารออกมา

OUTPUT:
Sandwich
Lobster Pasta
Spaghetti Carbonara
Americano
End Orders

Subject

เป็นตัวแปรประเภทหนึ่งที่มีความเหมือนกับ Publisher แต่ว่าจะพิเศษกว่าก็คือ จะสามารถเพิ่มค่าที่อยู่บนลำดับของ Publisher ได้ โดยจะเรียก method send(_:) เจ้า Subject จะมีด้วยกัน 2 ตัวคือ.

  • PassthroughSubject: เป็น Publisher แบบหนึ่ง เมื่อทำการ subscribe จะได้รับค่าทั้งหมดตามลำดับที่เข้ามา โดยที่จะได้รับก็ต่อเมื่อทำหลัง subscribe เท่านั้น
    ตัวอย่าง จะเป็นการเชฟเพื่อรอทำอาหาร เมื่อเชฟมี Order เข้ามา จึงเริ่มทำอาหาร
OUTPUT:
Order: Spaghetti Carbonara
Order: Pantry Pasta
  • CurrentValueSubject: เป็น Publisher แบบหนึ่งเหมือนกับ PassthroughSubject แต่ว่าจะมีความต่างกันที่ CurrentValueSubject จะได้รับค่าก่อนหน้าที่จะทำ Subscribe มาด้วย 1 ครั้ง ตัวอย่าง
OUTPUT:
Order Pantry Pasta
Order Ribeye Steak
Order Cream of mushroom soup
Order Lasagna

Operator

เป็นฟังชั่นทำงานภายใต้ Business logic ที่คอยจัดการค่าที่ถูก Publisher ก่อนถูกทำ Subscription ผมจะยกตัวอย่างของ Operator ให้ดูแค่บางตัวนะครับ เนื่องจากมีเยอะมาก หากสนใจสามารถไปดูเพิ่มเติมได้ ที่นี่.

  • Map

แปลงค่าที่ได้รับทั้งหมดให้บน Upstream ให้เป็นอีกแบบหนึ่ง หรือแบบเดิมก็ได้

OUTPUT:
Order: Cofee
✔️
Order: Matcha ✔️
Order: Pasta ✔️
Order: Fried Rice ✔️
Order: Shrimp Paste Fried Rice ✔️
  • CombineLatest

เป็นการ Publisher ทั้งสองตัวเข้าด้วยกัน เป็น Publisher เดียวแล้วส่งออกไป

OUTPUT:
Ribeye Steak with Cheat’s Béarnaise sauce

Conclusion

สรุปความรู้สึกหลังจากได้ลองเขียนดูมีความรู้สึกว่ายังไม่ค่อยชินกับการใช้ Combine Framework สักเท่าไหร่ เนื่องจากส่วนตัวเคยใช้เพียง RxSwift แต่ว่าก็ยังไม่ชำนาญสักเท่าไหร่ ผมจึงสรุปออกมาได้ดังนี้

  • Performance ดีกว่าการใช้ RxSwift เนื่องจากเป็น Framework ของทาง Apple เอง (อ่านบทความเกี่ยวกับ Combine vs RxSwift ได้ที่นี่)
  • รองรับ iOS 13 ขึ้นไป
  • สำหรับคนที่เคยเขียน RxSwift มาก่อน มีบางอย่างที่ต้องปรับความเข้าใจใหม่

ก็จบไปแล้วนะครับกับการเขียนบล็อกครั้งที่ 2 ของผมถ้าหากมีความผิดพลาดประการใด สามารถติชมได้ครับ ส่วนตัวยังไม่เคยลองใช้ Combine Framrwork แบบจริงจัง แต่คิดว่าเป็น Framework ที่ในอนาคตได้ใช้แน่นอน เนื่องจากความเร็วในการทำงานก็ดีกว่า RxSwift และไม่หนักเครื่องเพราะว่าไม่ต้องลง Library เพิ่มในโปรเจ็ค ขอบคุณที่อ่านกันจนจบครับ 😄

reference.

--

--