บทความและข่าวสาร | Seven Peaks Insights

มาใช้ Swift ให้คล่องขึ้นกันดีกว่า

สรุปการบรรยายจากงาน iOS meetup ของเรา

Lets-get-swiftly-ios-meetup-summary-at-Seven-Peaks-Software-1536x1024

 

เกริ่นนำ

ในการจัดงาน iOS meetup ครั้งนี้ ทีมงานผู้เชี่ยวชาญของ Seven Peaks Software จะแนะนำให้คุณรู้จักกับภาษา Swift พร้อมด้วยเคล็ดลับในการใช้งานที่ทันสมัยที่สุดเพื่อการพัฒนาแอปฯ บน iOS ให้ประสบความสำเร็จ

วิทยากรคนแรกคือคุณ Rupendra Limbore เขาเป็น Tech Lead ผู้มีประสบการณ์กว่า 12 ปี ในการพัฒนาแอปฯ มากมายบน iOS ไม่ว่าจะเป็นแอปฯ เกี่ยวกับการเงิน การแพทย์ และอีคอมเมิร์ซ โดยเขาได้เริ่มงาน meetup ครั้งนี้ด้วยการพูดถึงการใช้งาน concurrency ใน Swift

Concurrency คือสิ่งที่ทำให้โปรแกรมสามารถรองรับ task จำนวนมากในเวลาพร้อมๆ กันได้ อย่างไรก็ตาม การเขียนโปรแกรมให้ทำงานหลายอย่างได้พร้อมกันเหมือนจะดูเป็นเรื่องง่าย แต่ก็ไม่ได้ง่ายอย่างที่คิด เพราะอาจต้องเสียเวลานานในการจัดการกับ thread และ lock ซึ่งทำให้การเขียนโปรแกรมแบบนี้เป็นเรื่องยาก

หัวข้อที่เขาพูดจะเน้นเรื่องของการอธิบาย concurrency ให้เข้าใจง่ายมากที่สุดเท่าที่จะเป็นไปได้ เพื่อให้นักพัฒนา Swift ตั้งแต่ระดับกลางขึ้นไปถึงระดับสูงสามารถนำแนวคิดดังกล่าวไปปรับใช้กับโปรเจกต์ของพวกเขาได้

วิทยากรคนที่สองคือ คุณศราวุธ สินสมรส ซึ่งเป็น Senior iOS Developer ผู้มีแนวคิดทางด้านเทคโนโลยีที่สร้างสรรค์ พร้อมประสบการณ์ในการพัฒนาแอปฯ ด้านการเงินและอีคอมเมิร์ซบน iOS มานานกว่า 10 ปี

นอกจากนี้ เขายังมีประสบการณ์ในตำแหน่ง backend developer รวมถึงสามารถจัดการฐานข้อมูลและระบบเน็ตเวิร์กได้อีกด้วย

คุณศราวุธจะมาเจาะลึกเกี่ยวกับ subject และ operator ใน RxSwift ด้วย ซึ่ง RxSwift คือ ไลบรารีสำหรับสร้างโปรแกรมแบบ asynchronous และ event-driven พร้อมด้วย observable sequence ดังนั้น subject และ operator จึงเป็นพื้นฐานสำคัญของ RxSwift เลยทีเดียว

หัวข้อของเขาจะช่วยให้คุณเข้าใจกลไกการทำงานและคุณสมบัติของ subject รวมถึงองค์ประกอบหลักๆ ของ operator ใน RxSwift ได้เป็นอย่างดี ซึ่งหากเข้าใจหลักการเบื้องต้นเหล่านี้ได้จะมีประโยชน์มาก

วิทยากรคนสุดท้าย คุณรัตนชัย อุ่ยตระกูล ผู้มีตำแหน่ง Senior iOS Developer ที่มีประสบการณ์ 8 ปีในการพัฒนาแอปพลิเคชันด้านอีคอมเมิร์ซ, video streaming, บันเทิง, และการใช้งานในองค์กรขนาดใหญ่ จะมาสาธิตวิธีการปรับปรุงประสิทธิภาพแอปฯ ของคุณ

เขามีความหลงใหลในการลดความซับซ้อนของโค้ดและกระบวนการทำงาน รวมถึงการมอบประสบการณ์ในการใช้งานอันยอดเยี่ยมให้กับผู้ใช้

คุณจะเข้าใจเครื่องมือ ตัวชี้วัด และแนวคิดที่จะช่วยให้กระบวนการพัฒนามีความราบรื่นและส่งผลให้ผู้ใช้ได้รับประสบการณ์ในการใช้งานแอปฯ ดียิ่งขึ้นได้ เพราะประสิทธิภาพของแอปฯ คือสิ่งสำคัญอย่างยิ่งในการสร้าง engagement กับผู้ใช้ และดึงดูดให้พวกเขากลับมาหาคุณอีกเรื่อยๆ

เมื่อแอปฯ มีขนาดใหญ่ขึ้น มีฟีเจอร์เยอะขึ้น และมี dependencies ภายนอกเพิ่มขึ้น จึงจำเป็นอย่างยิ่งที่จะต้องประเมินผลกระทบจากการเปลี่ยนแปลงเหล่านี้และปรับปรุงแอปฯ ให้มีประสิทธิภาพดีขึ้นอย่างต่อเนื่อง

 

 

Concurrency คืออะไร

ในที่นี้เราจะใช้ลูกอมในกล่องเป็นตัวอย่าง โดยสาธิตว่ามี 2 วิธีที่จะใส่ลูกอมลงในถ้วยให้ครบ 6 เม็ด วิธีแรกนั้นง่ายที่สุด คือหยิบลูกอมจากกล่องทีละเม็ดแล้วใส่ลงไปในถ้วย ซึ่งต้องทำทั้งหมด 6 ครั้ง

วิธีที่สองคือ หยิบลูกอมทีละ 2 เม็ดด้วยมือทั้ง 2 ข้าง ข้างละ 1 เม็ด แล้วใส่ลงในถ้วย ซึ่งจะต้องหยิบเพียง 3 ครั้ง เท่านั้น

หมายความว่าอย่างไร

  • อย่างแรกคือ การแยกขั้นตอนการทำงานของโปรแกรมออกเป็น 2 ขั้นย่อยๆ โดยใช้วิธีแรกหรือวิธีที่สอง
  • อย่างที่สองคือ ความสามารถในการ execute panel ซึ่งขั้นตอนนี้สามารถทำแบบคู่ขนานกันได้ อย่างที่แสดงในวิธีที่สองในการหยิบลูกอมพร้อมกัน 2 เม็ด
  • อย่างที่สามคือ ลำดับของการ execute ซึ่งควรจำไว้ว่าลำดับการหยิบลูกอมและการใส่ลงในถ้วยนั้นไม่มีความสำคัญใดๆ ผลลัพธ์ที่ต้องการคือลูกอมทุกเม็ดต้องใส่ลงในถ้วยให้ครบก็พอ

ข้อดีของการใช้ concurrency

Concurrency มีข้อดีบางอย่างที่ทำให้เราจำเป็นต้องใช้มัน ได้แก่

  • ความเร็วในการตอบสนองดีขึ้น – เหมือนอย่างที่เราใช้เวลา 6 วินาทีในการหยิบลูกอมทีละเม็ดแล้วใส่ลงในถ้วย แต่ใช้เวลาเพียง 3 วินาทีในการหยิบลูกอมทีละ 2 เม็ดลงในถ้วยนั่นเอง ดังนั้น concurrency จึงช่วยให้ใช้เวลาในการทำงานน้อยลง
  • เพิ่มปริมาณงานได้มากขึ้น – เมื่อหยิบลูกอมเพียงเม็ดเดียว ก็ถือว่ามีปริมาณงานแค่ชิ้นเดียว แต่พอหยิบทีละ 2 เม็ด ปริมาณงานที่ได้ก็จะเพิ่มขึ้น
  • ใช้ทรัพยากรเต็มประสิทธิภาพ – วิธีแรกนั้นใช้แค่มือข้างเดียวในการหยิบลูกอมทีละเม็ด ทำให้มืออีกข้างว่างอยู่ ซึ่งเป็นการใช้ทรัพยากรได้ไม่เต็มประสิทธิภาพ ในขณะที่วิธีที่สองสามารถใช้มือทั้งสองข้างในการหยิบลูกอมทั้งสองเม็ดขึ้นมาพร้อมกัน และใช้ทรัพยากรได้คุ้มกว่า

วิธีแก้ปัญหา

1) Thread

Thread คือ base class ที่ทำให้เราสามารถจัดการกับ thread ที่มีอยู่ในระบบปฏิบัติการและ manipulate มันได้ ซึ่ง thread เป็นคลาสที่กำหนดและประกาศใน foundation framework

ดังนั้น ในระหว่างที่ใช้งาน เราจำเป็นต้อง import ตัว foundation framework มา ซึ่ง thread จะมีให้ใช้ตั้งแต่ iOS 2.0 เป็นต้นไป

นี่เป็นคลาสพื้นฐานและสามารถนำมาใช้ด้วย initializer ที่จะทำการส่ง prop ไปหามัน หรืออาจใช้วิธี subclass thread แล้วทำการ implement main method เข้าไปแทน

Thread priority คืออะไร

มันคือการกำหนดค่าเพื่อกลยุทธ์การ execution ที่ตรงเวลา

thread priority จะมีค่าระหว่าง 0 ถึง 1 โดยมี default value เป็นเศษ 0.5 ซึ่ง Apple ได้จัดทำเอกสารข้อมูลเอาไว้ชัดเจนว่าค่าเหล่านี้เป็นเพียงแนวทางคร่าวๆ เท่านั้น

ค่าดังกล่าวไม่สามารถยืนยันได้ว่าระบบปฏิบัติการจะทำตามลำดับความสำคัญที่เรากำหนดไว้หรือไม่ เนื่องจากลำดับความสำคัญในการ execute thread นั้นจะถูกเลือกโดยระบบปฏิบัติการในระดับ kernel

ดังนั้น ค่าที่เราพูดถึงนี้จึงเป็นแนวทางเบื้องต้นที่ระบบปฏิบัติการจะถามเกี่ยวกับลำดับความสำคัญในการจัดการกับ thread นั่นเอง

Thread Demo

เราจะ implement thread demo ง่ายๆ สักชุดหนึ่งอย่างไร

ในสถานการณ์ที่เราจำเป็นต้องอัปโหลดรูปภาพขึ้นไปบนเซิร์ฟเวอร์นั้น โดยมี 4 ขั้นตอนที่คุณต้องทำให้สำเร็จ ดังต่อไปนี้

  • ดึงไฟล์รูปมา
  • ปรับขนาดไฟล์
  • บีบอัดไฟล์
  • อัปโหลดไฟล์

ในการทำเช่นนี้ คุณจำเป็นต้องกำหนดคลาสที่แตกต่างกัน 4 คลาส ที่มีหน้าที่รับผิดชอบในแต่ละขั้นตอน ซึ่งในคอร์สนี้ เราไม่ได้สอนวิธีการสร้างให้มันทำงานได้เต็มรูปแบบ แต่แค่มีไว้เพื่อใช้งานทั่วไปเท่านั้น ซึ่งคลาสเหล่านี้จะนำฟังก์ชันที่เรากำหนดให้ไป implement แต่มันจะไม่สนใจ thread, concurrency, หรือการประมวลผลใดๆ ที่ทำงานอยู่เบื้องหลัง

ปัญหาก็คือ เมื่อใดก็ตามที่เราเรียกใช้ฟังก์ชันเหล่านี้โดยตรงมาจาก view controller หรือ view model มันจะเริ่มการทำงานที่ main thread ซึ่ง main thread นั้นมีการใช้งานสำหรับอัปเดต UI อยู่เสมอ

เมื่อเราเริ่มเรียกใช้ method เหล่านี้ UI ก็จะโดนบล็อก นั่นคือสาเหตุว่าทำไมทุกวันนี้เราถึงจำเป็นต้องเรียกใช้ method ให้ทำงานอยู่เบื้องหลัง เนื่องจากตัวต้นเหตุเหล่านี้ถูก implement โดยไม่คำนึงถึง concurrency ที่กำลังทำงานอยู่

ทำอย่างไรดี

เราสามารถแก้ปัญหาได้ด้วยการบริหารจัดการและ implement คลาสที่แตกต่างกันเพื่อจัดการกับ concurrency ทีนี้ลองดูจากแผนภูมินี้ว่ามีการ implement อย่างไรบ้าง โดยมันจะจัดการกับ process ที่กำลังดำเนินการอยู่ รวมถึงส่ง callback จากฟังก์ชันที่เรียกมันมาให้เรา

Callback คืออะไร

callback คือโค้ดชุดหนึ่งที่จะถูกบันทึกลงไปเมื่อฟีเจอร์, ฟังก์ชัน, หรือโค้ดบล็อกหนึ่งถูก execute ดังนั้น เมื่อ asynchronous task ของคุณทำงานเสร็จแล้ว คุณก็มีหน้าที่เรียก callback และให้ข้อมูลกับฟังก์ชันที่เรียกมันมาว่า task ดังกล่าวทำงานเสร็จเรียบร้อยแล้ว

ทีนี้ callback อาจจะ void ซึ่งหมายความว่ามันจะไม่มีรายละเอียดอะไรเลย และยังแสดงผลลัพธ์ที่เราสามารถนำไปใช้ในฟังก์ชันได้ ซึ่งในกรณีนี้เราใช้อีเมลในการทดสอบ

คุณอาจจะสงสัยว่ามันมีหน้าที่อะไร ซึ่งถ้าเราดึงไฟล์รูปมา ผลลัพธ์ที่คาดหวังก็ควรจะเป็นไฟล์รูป หากมีข้อผิดพลาดใดๆ เกิดขึ้น อีเมลจะคอยบอกว่าเกิดอะไรขึ้นบ้าง

เราเรียก method นี้ว่าอะไร

มันคือ indentation ซึ่งเป็นอันที่ซับซ้อนมาก หรือที่เรียกกันว่า callback hell

ถ้าหากเรามีการทำงานของโค้ดหลายขั้นตอน เราจะต้องมี indentation และสร้างบล็อกข้างในบล็อกเป็นชั้นๆ ซึ่งเรียกกันว่า callback hell

ขั้นตอนต่อไปมีความสำคัญมาก นั่นคือ color thread ซึ่งเป็นที่ที่ฟังก์ชันจะโดนเรียก ซึ่งมีคนมากมายทำผิดพลาดด้วยการเรียก callback จาก queue หรือ thread ที่กำลังถูก execute อยู่

จะเกิดอะไรขึ้นหากคุณรันบางอย่างไว้เบื้องหลังแล้วเรียก callback ใน background thread ในตอนนั้นฟังก์ชันที่เรียกใช้งานอาจจะอยู่ใน view controller ซึ่งยังมีโอกาสที่จะถูกเรียกใน background thread ได้เช่นกัน

แล้วถ้าคุณกำลังอัปเดต UI ในส่วนนี้ แอปพลิเคชันของคุณก็จะล่ม เพราะว่าคุณกำลังอัปเดต UI จาก background thread นั่นเอง ซึ่งเป็นสิ่งที่ไม่ควรทำ

2) Grand Central Dispatch (GCD)

คือ base class ที่ทำให้เราสามารถจัดการและ manipulate thread ที่มีอยู่ในระบบปฏิบัติการได้ โดยคลาส thread นี้จะถูกกำหนดใน foundation framework

ซึ่งมีอยู่ 3 ประเภทด้วยกัน แบ่งตามการสร้าง ดังนี้

  • Main queue – เป็นสิ่งที่ Apple สร้างขึ้นมาให้ โดยมันจะเข้าถึง main thread ได้ตลอดเวลา ดังนั้น เมื่อไรก็ตามที่คุณทำอะไรเกี่ยวข้องกับ UI คุณจะต้องทำบน main queue
  • Global queue – จัดการกับ background thread และเป็นสิ่งที่ Apple สร้างขึ้นมาให้เช่นเดียวกัน
  • Custom queue – ต้องสร้าง label และ parameter ขึ้นมาสองสามอัน เช่น QoS และ attribute อื่นๆ

และสามารถแบ่งตามประเภทของ execution ได้ 2 ประเภท ดังนี้

  • Serial queue (เช่น main queue) – เป็นที่ที่ task จะถูก execute ทีละอันตามลำดับ
  • Concurrent queue (เช่น global queue) – เป็นที่ที่ task จะถูก execute พร้อมๆ กัน

Quality of Service (QoS)

  • User interactive: เป็น queue ที่จะต้อง execute อย่างรวดเร็วที่สุดเท่าที่จะเป็นไปได้
  • User-initiated: เป็น queue ที่อยู่ในความสำคัญระดับสูง
  • Default: เป็น queue ที่อยู่ในความสำคัญระดับทั่วไป
  • Utility: เป็น queue ที่อยู่ในความสำคัญระดับต่ำ จะถูก execute แบบที่ใช้พลังงานต่ำโดยไม่ส่งผลกระทบต่อประสิทธิภาพมากนัก
  • Background: เป็น queue ที่อยู่ในความสำคัญระดับต่ำสุด ซึ่ง task จะถูก execute ด้วยการใช้พลังงานน้อยที่สุดเท่าที่จะเป็นไปได้

เราจำเป็นต้องคำนึงถึงลำดับความสำคัญของสิ่งที่รันอยู่เบื้องหลัง ไม่อย่างนั้น background QoS จะทำงานเมื่อมี task ที่อาจจะรันไม่กี่นาที ไปจนถึงหลายชั่วโมง เช่น indexing ที่เราต้องรวบรวมข้อมูลสำคัญจากพื้นที่เก็บข้อมูลของระบบ

สิ่งที่น่าสนใจเกี่ยวกับ GCD และ operation queue คือมันจะมี callback เสมอ

3) OperationQueue

มันเป็นสิ่งที่เหนือกว่า thread และ GCD

เนื่องจากว่ามันทำให้คุณมีฟังก์ชันมากมายอย่าง cancelling, มีตัวจัดการ dependency, และสามารถ implement ได้ง่ายกว่าและมีความ object-oriented มากกว่า

สำหรับ operation queue เรามี operation class ซึ่ง Apple มี 2 คลาสให้เราใช้ในการ implement ได้แก่ block operation และ invocation operation และเรายังสามารถ subclass operation class ได้ด้วยตัวเอง แล้วทำการ implement main method เข้าไป

เมื่อ operation มี dependencies ครบถ้วนแล้ว ก็จะสามารถเริ่ม execute ได้ นี่คือโค้ดง่ายๆ สำหรับการ implement operation ดังกล่าว

block operation คืออะไร

block operation ใช้ block ในส่วนของ initializer และคลาสอื่นที่เราสามารถ implement เมื่อเราจำเป็นต้อง override main method ได้ เริ่มจากการ initialize operation class ใส่มันลงไปใน operation tube เท่านี้ก็เรียบร้อย สำหรับ operation queue นั้น มีให้ใช้ตั้งแต่ iOS 2.0 เป็นต้นมา

States

เมื่อเราเริ่มการทำงานของ operation จะมีสิ่งที่เรียกว่า state ของ operation อยู่ ซึ่งจะถูกกำหนดและมีให้ใช้สำหรับเป็น seat เพื่อการแก้ไข operation โดยแบ่งออกเป็น 4 state ดังต่อไปนี้

  • Ready: เป็นสถานะเตรียมความพร้อมที่ operation พร้อม execute ซึ่งหมายความว่า dependencies ทั้งหมดของ operation มีครบแล้วและพร้อมสำหรับการ execute นั่นเอง
  • Executing: task นี้กำลังทำงานอยู่ ซึ่ง executing state จะเกิดขึ้นเมื่อ operation ถูก execute แล้ว ดังนั้น เมื่อเราเติมมันลงไปใน operation queue ก็เท่ากับคุณเริ่มการ execute
  • Finished: เกิดขึ้นเมื่อ process เสร็จสมบูรณ์ ซึ่ง operation ที่จบการทำงานของ task ทั้งหมดจะมาอยู่ใน state นี้
  • Canceled: task ถูกยกเลิกไป เกิดขึ้นเมื่อโปรแกรมเมอร์ยกเลิก operation ด้วยการเรียก canceled method แล้วมันก็จะไปอยู่ใน canceled state ดังกล่าว

และนี่คือ 4 ขั้นตอนสำคัญในการทำงานของ operation queue

4) Async-Await (Swift 5.5)

Async-Await มีการนำมาใช้ใน Swift ตั้งแต่เวอร์ชัน 5.5 และ iOS 13 เป็นต้นไป โดยฟีเจอร์ของมันคือการทำให้เราสามารถ implement structural concurrency ได้ โดยสามารถนำไป implement ได้ด้วย cache ขนาดใหญ่ ส่วน return parameter ก็มีให้ใช้สำหรับ method ทุกรูปแบบเช่นเคย

ข้อดี

  • หลีกเลี่ยงการเกิด callback hell/pyramid of doom
  • จำนวนบรรทัดโค้ดน้อยกว่า
  • อ่านง่ายขึ้นกว่าเดิม
  • สามารถรับประกันว่าจะได้รับ return result อย่างแน่นอน

Meetup-iOS-Concurrency-r4_page-0007

คุณเป็น iOS developer ที่มีความสามารถหรือเปล่า
อ่านรายละเอียดการรับสมัคร Senior, Mid-level, และ Junior iOS developer ได้ข้างล่างนี้!
อ่านรายละเอียดงาน iOS Developer

RxSwift: subjects และ operators

RxSwift คือไลบรารีสำหรับจัดการ asynchronous task โดยแบ่งออกเป็น 3 องค์ประกอบหลักๆ ต่อไปนี้

  • Observable – รับผิดชอบในการสร้าง event และส่งมันไปยังองค์ประกอบส่วนอื่นๆ ซึ่ง event ดังกล่าวอาจเป็นได้ทั้ง ข้อมูล, Complete Signal (success), และ Complete signal (error)
  • Observer – เป็นโค้ด block หนึ่งที่ใช้รับ event มาจาก observable และคุณสามารถสร้าง logic บางอย่างที่เกี่ยวข้องกับธุรกิจได้ตรงนี้
  • Operator – คุณสามารถเพิ่ม operator ระหว่าง observable และ observer เพื่อ manipulate ข้อมูลของ event จาก observable ก่อนจะส่งต่อไปยัง observer ได้

Subjects

เป็น observable ที่สามารถเพิ่ม item ได้ตอน runtime

  • PublishSubjects – นิยมใช้กับแอปพลิเคชันที่ทำจาก Rx เนื่องจากมีความตรงไปตรงมา เพราะเมื่อมันรับ item ใหม่มา มันจะ emit item ไปยัง subscriber โดยตรง
  • BehaviorSubjects – ความแตกต่างระหว่างสิ่งนี้กับ PublishSubject ก็คือ คุณจะได้รับ item ทันทีหลังจาก subscribe เสร็จแล้ว ซึ่งจะเป็น item ล่าสุดใน subject นั้น
  • ReplaySubjects – มาพร้อมกับ buffer ซึ่งจะคอย emit item ทั้งหมดออกไปและส่งพวกมันไปยัง subscriber เมื่อกำลังทำการ subscribe
  • AsyncSubjects – เป็น subject ที่เรียบง่ายที่สุดใน RxSwift โดยมันจะ emit เฉพาะแค่ item ตัวหลังสุดไปยัง subscriber หลังจากที่ subject ได้รับ event ที่เสร็จสมบูรณ์แล้ว

การรวม operator

Operator ที่ทำงานร่วมกับ observable จากหลากหลายแหล่ง เพื่อสร้าง single output observable ได้แก่

  • CombineLatest – พวกมันรวม item จากหลากหลาย input ไว้ด้วยกัน และจะ emit item เหล่านี้เป็นคู่ออกไปยัง output
  • Merge – operator ตัวนี้จะรวม item ทั้งหมดจากหลายแหล่งไปยัง output observable
  • Zip – คล้ายกับ CombineLastest แต่มันจะไม่ emit item ที่เคย emit ออกไปแล้ว
RxSubjectAndOperators
 

วิธีทำให้แอปพลิเคชันของคุณมีประสิทธิภาพในการทำงานดีขึ้น

ภาพรวม

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

แอปพลิเคชันยุคใหม่มีความซับซ้อน มากขึ้นเรื่อยๆ และบรรจุข้อมูลขนาดมหึมา เอาไว้ ซึ่งเราต้องนำไปสื่อสารกับระบบภายนอก และอาจกลายเป็นฝันร้ายทางวิศวกรรมซอฟต์แวร์ได้เลยทีเดียว

การสร้างแอปพลิเคชันใหม่ขึ้นมา สิ่งที่ไม่ควรมองข้ามคือเรื่องประสิทธิภาพ ยิ่งแอปพลิเคชันมีขนาดใหญ่ขึ้นและซับซ้อนขึ้นเท่าไร คุณก็ควรให้ความสำคัญกับการปรับปรุงให้แอปฯ มีประสิทธิภาพตั้งแต่เนิ่นๆ มากขึ้นเท่านั้น เพราะประสิทธิภาพของแอปฯ คือสิ่งสำคัญอย่างยิ่งต่อการสร้าง engagement กับผู้ใช้และทำให้พวกเขากลับมาใช้งานอีกเรื่อยๆ.

การปรับปรุงแอปฯ ของคุณให้มีประสิทธิภาพดีอย่างต่อเนื่องจะ ทำให้ผู้ใช้อยากใช้งานแอปฯ นั้นบ่อยขึ้น, และ engage กับแอปฯ ของคุณนานขึ้น.

คุณสามารถใช้งาน MetricKit สำหรับการปรับปรุงประสิทธิภาพแอปฯ ของคุณได้ ซึ่งเป็นเครื่องมือและ SDK ที่ Apple มีไว้ให้ใช้

มีตัวชี้วัด 8 อย่างเกี่ยวกับประสิทธิภาพ ได้แก่

  1. การใช้งานแบตเตอรี
  2. ความเร็วในการเปิดใช้งาน
  3. Hang rate
  4. การใช้งานหน่วยความจำ
  5. การเขียนข้อมูลลงดิสก์
  6. Scrolling
  7. การปิดตัวเอง
  8. MXSignposts
    – จะทำการประมวลตัวชี้วัดเหล่านี้ที่เซิร์ฟเวอร์ของคุณ
    – คำนวณ custom internal ในแอปฯ
    – Import MetricKit
    – Subscribe ไปยัง MXMetricManager
    – Implement MXMetricManagerSubscriber method เพื่อรับข้อมูลที่รวบรวมมา

Apple จะเชื่อมต่อกับตัวชี้วัดเหล่านี้โดยอัตโนมัติ ไม่จำเป็นต้องแก้ไขโค้ดใดๆ ในโปรเจกต์ของคุณ Apple จะเก็บข้อมูลของผู้ใช้จากอุปกรณ์ รวบรวมมันไว้ แล้วส่งไปยังเซิร์ฟเวอร์ของ Apple (iOS 13 และ iOS 14)

อย่างไรก็ตาม ในโมเดลรุ่นแรกๆ ของ iOS 15 มันจะส่งข้อมูลแทบจะทันทีเลย ซึ่งข้อมูลที่รวบรวมแล้วนี้จะแสดงอยู่ใน export

Xcode Organizer จะแสดงตัวชี้วัดที่สำคัญที่สุดจากแอปฯ ของคุณ

คุณสามารถใช้งาน MetricKit ได้ใน iOS 13 เป็นต้นไป และตอนนี้มี iOS 15 แล้ว ซึ่งมีการปรับปรุงหลายอย่างเพิ่มเติมขึ้นมา

การวินิจฉัยและกำจัดอาการ hang

เมื่อแอปฯ ไม่ตอบสนองต่อ input จากผู้ใช้ อาจทำให้ผู้ใช้ออกจากแอปฯ และทำให้พวกเขามีประสบการณ์ที่ไม่ดี การกำจัดอาการ hang จะทำให้แอปฯ ของคุณทำงานได้อย่างลื่นไหล รวดเร็ว และตอบสนองได้ดียิ่งขึ้น

  • ติดตามอาการ hang และ delay ในแอปฯ ของคุณ
  • แสดงเครื่องมือและ method เพื่อตรวจสอบ hang และสาเหตุที่ทำให้เกิดอาการดังกล่าว
  • ทดสอบดูว่าวิธีที่ดีที่สุดในการกำจัดอาการ hang คืออะไร

คุณสามารถดูวิดีโอบันทึกการบรรยายสดจากงาน iOS meetup ของ Seven Peaks Software ได้ที่เพจ Facebook ของเรา.

How-to-Get-Better-Performance-Out-of-Your-App
 
คุณเป็น iOS developer ที่มีความสามารถหรือเปล่า
อ่านรายละเอียดการรับสมัคร Senior, Mid-level, และ Junior iOS developer ได้ข้างล่างนี้!
อ่านรายละเอียดงาน iOS Developer