Posts

Showing posts with the label asynchronous

Grand Central Dispatch in Swift 3: A quick look

Image
Multi-threading และการทำงานแบบ Concurrency เป็นอีกเรื่องสำคัญในการเขียนโปรแกรมสมัยใหม่ และแน่นอนถ้าพูดถึงเรื่องนี้บน Apple Platform สิ่งแรกที่เรานึกถึงกันคงจะเป็น Grand Central Dispatch ซึ่งเป็น C-style API ที่อยู่กับเรามาช้านาน แค่อยู่บน Objective-C ก็ไม่สวยแล้ว พอยิ่งมาอยู่ภาษาสมัยใหม่อย่าง Swift ยิ่งรู้สึกไม่เป็นมิตรใหญ่ที่ต้องมาเขียน C-style แบบนี้ (จริงๆ ก็มี NSOperationQueue มาให้ตั้งนานแล้วนะ แต่ส่วนตัวก็ยังไม่ชินกับมันอยู่ดี) พอมาใน Swift 3 นั้น Apple ได้ยกเครื่อง libdispatch (อีกชื่อเรียกผ่าน Clang Foundation) หรือ Grand Central Dispatch ที่เราเคยรู้จักใหม่ทั้งหมด ซึ่งวันนี้จะมา Overview ให้ดูคร่าวๆ ว่าหน้าตาเปลี่ยนไปแค่ไหนบ้าง (ผมเคยกล่าวคร่าวๆ ไว้แล้วที่ ภาพรวมความเปลี่ยนแปลงของ Swift 3 ) dispatch_async สำหรับ API ตัวนี้ เมื่อก่อนเราต้องกำหนดวิธีการก่อนว่า เราจะสั่งให้งานที่เรากำลังจะทำเป็นแบบ synchronus หรือ asynchronus จากนั้นค่อยเลือกว่าจะให้ queue ตัวไหนเป็นคนจัดการ แต่ของใหม่จะกลับกระบวนการกัน โดยที่เราสร้าง queue ขึ้นมาก่อนแล้วค่อยจัดการเรื่องวิธีการ...

Continuation Passing Style in Swift

Image
ก่อนอื่นเลย เราอยากบอกว่า Apple ไม่ชอบท่าดัก Exception เท่าไหร่ แม้จะมี try / catch / finally ให้ใช้ แต่ดูได้เลย ไม่มีใครเขียนเป็น Production Code กันเลย (ในประสบการณ์ที่ผมเห็นโค้ดมาน่ะนะ) โดยในการทำ Error Handling บน Objective-C นั้นท่าที่เราเจอประจำคือการใช้ NSError ส่วนใน Swift นั้นจะตัดการทำ Throw Exception ออกไปเลย (ยกเว้นการทำ assert() ยังคงมีให้ใช้อยู่) และการใช้ NSError ก็คล้ายกันกับใน Objective-C นั่นแหละ แบบนี้ คราวนี้ใน Swift นั้นมีอีกทางเลือกหนึ่งที่ดูดีกว่า (หรือปล่าว ?) นั่นคือการใช้ Tuples เข้ามาช่วยให้เราส่งค่าหลายๆ ค่าออกมาจาก Function พร้อมๆ กัน แบบนี้ ลองชั่งใจกันเองครับ ว่าท่าไหนสวยกว่า... แต่เคยมีการ Discuss กันใน Facebook ของบรรดาคนในวงการมาตั้งคำถาม (ซึ่งผมหาไม่เจอแล้ว) มีอาจารย์ท่านนึงตอบได้น่าสนใจมากว่า (ผมก็พยายามนึกเอาล่ะนะ ไม่เป๊ะหรอก) การส่ง Error กลับไปด้วยการทำ Pass by reference นั้นถูกเขียนด้วยความเข้าใจที่ว่า "ฟังก์ชั่นควรส่งค่าอะไรกลับ" ซึ่งในที่นี้ชื่อฟังก์ชั่นบอกเราว่าจะต้องได้ Data กลับมา ดังนั้นเราจะมอง E...