Posts

Showing posts with the label grand central dispatch

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 ขึ้นมาก่อนแล้วค่อยจัดการเรื่องวิธีการ...

[iOS Dev] Grand Central Dispatching

Image
ผมยังไม่มี Case Study กับการใช้ GCD ชัดเจน พอดี ได้ดู Lecture ของ Stanford มาถึงเรื่องนี้ และน่าสนใจที่จะเอาไปใช้มากๆ...  Case Study ใน Lecture คือ  ถ้าเรามีการ Fetch ข้อมูลจาก Server ใส่ TableView  ในจังหวะที่กด Refresh เพื่อขอข้อมูลจาก Server นั้น UI คือส่วน TableView นั้นจะขยับไม่ได้ หรือช้ามาก  เนื่องจากว่า ในขณะที่ Fetch Data อยู่นั้น ... Data จะมาเรื่อยๆ และ Dalegate ของ TableView ที่จะนำข้อมูลขึ้นแสดงผลนั้น ทำงานตลอดเวลา ทำให้การทำงานมันซ้อนกัน ...  เราจะแก้ยังไงดีล่ะ Grand Central Dispatch มาช่วยตรงนี้ นั่นคือ เราจะแยก Process ออกเป็น 2 ส่วน นั่นคือ  ส่วนที่แสดงผล ให้ทำที่ Main Thread (UI Thread) ส่วนที่ Fetch Data ให้ทำที่ Another Thread (Background Thread) ส่วนจะทำงานอย่างไร เราแค่ใส่โค้ดของ GCD ซึ่งเป็น C API ลงไปได้เลยครับ จะทำงานอย่างไรนั้น GCD จะเป็นคนจัดการ เพียงแต่เราต้องแยกให้ถูกว่า  เหตุการณ์ไหนจะให้ทำงานบน Main Thread ที่เหลือ GCD จัดการเอง  ตัวอย่างด้านบน ขอให้ไปดูกันเองนะครับ มันเป็...