[iOS Dev] Grand Central Dispatching

ผมยังไม่มี 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 จัดการเอง 

ตัวอย่างด้านบน ขอให้ไปดูกันเองนะครับ มันเป็นส่วนของการ Demo โปรแกรมใน Lecture นั้น
ลองมาดูอีกตัวอย่างที่ง่ายกว่านะครับ นี่เป็นตัวอย่างใน Slide แหละ 


Code นี้ไม่มีอะไรมาก ... เป็น Code ที่จะโหลดภาพมาจาก url แล้วใส่แสดงภาพนี้ผ่าน ImageView + ScrollView เท่านั้นเองนะครับ 

มาดู Code หลังจากที่ใส่ Grand Central Dispatching นะครับ 


ก็จะได้ตามนี้ครับ ... ดูตัวสีแดงนะครับ เหตุการณ์ที่ Response ณ ขณะนั้นที่ผมกล่าวถึง ส่วนใหญ่มันหมายถึงการทำงาน UIKit ต่างๆ ล่ะครับ ... 

จากภาพเราแค่เอาการทำงานทั้งหมด เข้า Queue ของการทำงานเท่านั้น เรายังไม่ได้แยกการทำงานของ Main Thread ออกมา 


จะเห็นได้ว่า แยกการทำงานของ Main Thread ออกมาเรียบร้อยแล้ว ... แต่ Code แบบนี้จะเกิด Leak จาก GCD ฉะนั้นเราต้อง release มันด้วย หลังจากการทำงานเสร็จสิ้น 


เป็นอันเสร็จสิ้นครับ ... 

ผมก็ได้ Notes เรื่องนี้ใน Twitter (@iMacbaszii), Facebook ของผมเหมือนกัน 
และก็มีพี่ๆ มาให้คำแนะนำ ... ก็ขอเอามาโพสที่นี่ด้วยแล้วกัน เผื่อเป็นประโยชน์ 



จบแล้ว บ๊ายยย...บายยยย ~ 

Popular posts from this blog

12 วิธี การบริการและดูแลลูกค้าในร้าน Starbucks

"อีสุกอีใส" ประสบการณ์เมื่อต้องมาเป็นตอนอายุ 22

[Android Dev] การติดตั้ง Eclipse+AndroidSDK เพื่อพัฒนาโปรแกรมบน Android