Posts

Showing posts with the label delegate

Don't forget Weak in Delegation Pattern

Image
ผมเห็นโค้ดหลายคน และโค้ดผมเอง เมื่อหลายเดือนก่อนที่เริ่มเอา Swift เข้ามาใช้อย่างจริงจังในออฟฟิศ พบว่า Memory Leak กระจายเลยครับ... ดีนะ ที่รู้ตัวทันก่อนจะส่งมอบโค้ดชุดนั้นให้ลูกค้าไป Delegation Pattern เป็นสิ่งที่เราใช้กันหลายจุด ใน iOS Development ในสมัยของการเขียน Objective-C ตามหลักการของ ARC นั้น เราควรประกาศตัวแปร delegate ใน class ที่ต้องการรับความช่วยเหลือเมื่อถึงเวลาใดๆ เป็น weak เนื่องจากปัญหา Retain Cycle ส่วนเกิดได้อย่างไร นั้นลองไปศึกษาดูเองนะครับ และเมื่อเราถูกสอนมาแบบนั้น ทำให้เรามาเขียนแบบนี้กับ Swift แล้วพบว่าโดน compiler ด่าแบบนี้ หลายคนก็เลยเอาออก เพราะว่าเอาออกแล้วมันใช้ได้... และคิดว่า Swift น่าจะฉลาดพอที่จะใส่ให้เราเอง แบบ @IBOutlet ซึ่งผิดถนัดครับ ไม่มีการใช้ให้อัตโนมัติใดๆ เนื่องจาก Protocol บน Swift จะใช้ในแนวทางของการทำ Type Sementics มากกว่า โดยธรรมชาติของมันเอง เลยทำตัวต่างจากคำว่า class นิดหน่อย และการประกาศ weak identifier ซึ่งต้องประกาศกับ object ใดๆ ที่เป็น class เท่านั้นตามที่โดนตักเตือน ในการใช้งาน Delegation Pattern ในรูปแ...

Intermediate Swift

Image
จากที่เขียนเรื่อง Basic ไปเมื่อคราวที่แล้ว ( http://www.macbaszii.com/2014/06/introduction-to-swift.html ) คราวนี้มาเรื่องที่ยากขึ้นหน่อยแล้วกันเนอะ โดยบาง Feature ของภาษา Swift บางอย่างก็จะมีอยู่แล้วใน Objective-C แต่ทำให้ดูน่ารัก น่าใช้ขึ้นอีกหน่อย Optionals เคยไหม ? ฟังก์ชั่นสักตัวที่ให้ค่ากลับมาเป็นผลลัพธ์ หรือบางทีก็ไม่ (nothing value) เรามักจะแยกประเภทเวลาที่ฟังก์ชั่นส่งค่าที่สื่อถึงการไม่มีค่ากลับมา เช่นถ้าเป็น NSRange ก็จะส่ง NSNotFound กลับมา อะไรที่เกี่ยวกับ Index เช่นการหาข้อมูลบางอย่างใน Array ก็จะส่ง -1 หรือไม่ท่าพื้นฐานก็ส่ง nil กลับมาเลย ทำให้ต้องไปดู Protocol ของฟังก์ชั่นที่ใช้ แล้วเช็คเงื่อนไขให้ถูกต้องนั่นแหละ แต่ใน Swift มีแนวคิดของการใช้ Optionals ตอนนี้เรามี " nothing value หรือปล่าว ?" ให้ใช้กันแล้ว เพียงแค่เติม ? ต่อท้ายไปเท่านั้นเอง มาดูตัวอย่างโค้ดนี้กัน จากตัวอย่าง Property Car ใน Person Class เป็น Optional นั่นหมายความ "คนอาจจะมี หรือไม่มีรถก็ได้" โดยเราจะไม่สามารถเข้าถึง Property ที่เป็น Optional ได้โดยตรงจะต้องทำสิ่งที่เ...

[iOS Dev] Insert and Delete Data in TableView (No Core Data)

Image
วันนี้ผมขอเสนอ Case Study ง่ายๆ ในการบอกแนวคิดในการ Insertion และ Deletion ข้อมูลใน TableView นะครับ ข้อมูลที่ใช้ในโจทย์ข้อนี้จะเป็นแค่ NSMutableArray เท่านั้น (แต่ถึงเวลาจริงๆ งานจริงๆ จะใช้ Core Data) เป็น Project เล็กๆ ที่ทำทุกอย่างใน Controller นะครับ ... DeletingTableViewViewController.h ในไฟล์ .h ก็ไม่มีอะไรมากนะครับ .. มี List ของข้อมูลซึ่งเป็น NSMutableArray และตัวแปรที่จะอ้างถึง TableView เพื่อทำการ reloadData ** แต่เราสามารถสร้าง ViewController ให้เป็น UITableView SubClasses ได้เลยครับ      ถ้าทำแบบที่ว่า เราจะสามารถใช้ self.tableView ได้ทันที ... แต่กรณีนี้ผมสร้าง Project แบบ      SingleView Application จึงต้องทำการสร้าง UITableView เอง DeletingTableViewViewController.m ในไฟล์ .m ส่วนแรก ก็ไม่มีอะไรมากนอกจากตั้งค่าเริ่มต้นให้กับข้อมูล และ ตั้งค่า UI ตอนเริ่มต้น โดยเพิ่ม UITableView ไปใน View และเพิ่มเติมอะไรนิดหน่อยที่ updateUI method ส่วนต่อไปคือ DataSource Method ของ UITableView ที่เราเรียกใช้ ซึ่งในส่วนแรก เป็นแค่การเร...

[iOS Dev] Delegate method for Notified Request is Success

Image
ขอ Blog เก็บไว้หน่อยนะครับ แต่อาจจะเป้นประโยชน์ Case Study คราวนี้ก็คือ .... ผม Download ข้อมูลจาก Cloud Web Service --> Parse.com จากนั้นผมจะบันทึกลง Core Data แล้วก็ใช้ Controller ในการ Fetch แต่ ปัญหา ตัวบะเริ้มเกิดตรงที่ว่า ... ในระหว่างการ Download ข้อมูลอยู่นั้น Controller ทำการ Fetch ไปแล้ว ทำให้ได้ข้อมูลว่างๆ กลับมา (เพราะยังโหลดไม่เสร็จ จึงยังไม่ได้ Insert ลง Core Data) เราจะแก้ปัญหานี้อย่างไรดี ? Delegate ตอบคำถามคุณได้ครับ ... เราเพียงแต่ใส่ Delegate เข้าไป แล้วสั่งให้ Fetch ในขณะที่ Download ข้อมูลเสร็จแล้ว ขณะนี้ผมมีโครงสร้างโปรแกรมแบบนี้นะครับ   Class ParsingData เป็น Model ที่เอาไว้ Parsing ข้อมูลจาก Web Service และบันทึกลง Core Data   Class ParseSiteViewController เป็น Controller เอาไว้ Fetch ข้อมูลจาก Core Data จากนั้นก็สร้าง Protocol Method พร้อมสร้างตัวแปร Delegate ให้กับ Class อื่นๆ ที่จะมาเรียกใช้ด้วย **อย่าลืม synthesize ด้วยนะครับ ParsingData.h จากนั้นเราบอกว่า ให้ Protocol Method นี้ถูกเรียกหลังจากที่ Download ข้อม...