ตอนที่ 8 iOS Swift การทำงานพร้อมกัน (Concurrency)

  1. Grand Central Dispatch (GCD) และ DispatchQueue
  2. Async/Await และการทำงานพร้อมกัน (concurrency) ที่มีโครงสร้าง (structured)
  3. Actors และบทบาท (role) ในการทำงานพร้อมกัน (concurrency)
  4. การยกเลิกงาน (Task cancellation) และลำดับความสำคัญ (priority)

ในช่วงไม่กี่ปีที่ผ่านมา ความต้องการการทำแอพประสิทธิภาพสูงและตอบสนองได้ทำให้การรับทำแอพสำรวจการทำงานพร้อมกันและการทำงานแบบคู่ขนาน (concurrency)ในการทำแอพ iOS Swift เป็นภาษาโปรแกรมที่ทรงพลังสำหรับทำแอพ iOS และ macOS มีเครื่องมือมากมายเพื่อจัดการกับการทำงานพร้อมกัน ทำให้การรับทำแอพสามารถทำแอพที่มีประสิทธิภาพและตอบสนองได้ง่ายขึ้น ในบทความนี้ เราจะเจาะลึกคุณลักษณะการทำงานพร้อมกันของ iOS Swift รวมถึง Grand Central Dispatch (GCD), DispatchQueue, async/await, การทำงานพร้อมกันที่มีโครงสร้าง, นักแสดง และการยกเลิกงานและลำดับความสำคัญ

1. Grand Central Dispatch (GCD) และ DispatchQueue

Grand Central Dispatch (GCD) เป็น API ระดับต่ำสำหรับจัดการการทำงานพร้อมกันใน iOS และ macOS GCD มอบวิธีที่มีประสิทธิภาพในการจัดการงานแบบอะซิงโครนัส ช่วยให้คุณสามารถกระจายงานผ่านหลายคอร์หรือโปรเซสเซอร์เพื่อปรับปรุงประสิทธิภาพของการทำแอพ

ที่แกนหลักของ GCD คือ DispatchQueue ซึ่งเป็นวัตถุที่จัดการการดำเนินการของงานตามลำดับการเข้าก่อนออกก่อน (FIFO) คุณสามารถสร้างอินสแตนซ์ DispatchQueue ด้วยคลาสและลำดับความสำคัญของบริการ (QoS) ที่แตกต่างกัน เพื่อให้แน่ใจว่างานที่มีลำดับความสำคัญสูงจะได้รับการดำเนินการก่อนงานที่มีลำดับความสำคัญต่ำกว่า

นี่คือตัวอย่างง่ายๆ ของการใช้ DispatchQueue:

let backgroundQueue = DispatchQueue(label: "com.example.background", qos: .background)

backgroundQueue.async {
    // Perform time-consuming tasks
}

DispatchQueue.main.async {
    // Update UI
}

2. Async/Await และการทำงานพร้อมกัน (concurrency) ที่มีโครงสร้าง (structured)

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

ฟังก์ชัน Async ถูกประกาศด้วยคีย์เวิร์ด ‘async’ และเรียกด้วยคีย์เวิร์ด ‘await’ เมื่อเรียกใช้ฟังก์ชัน async การดำเนินการจะถูกระงับจนกว่าฟังก์ชันจะส่งคืนผลลัพธ์ ทำให้งานอื่นๆ สามารถทำงานพร้อมกันได้

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

นี่คือตัวอย่างการใช้ async/await:

func fetchImage() async -> UIImage {
    // Fetch image asynchronously
}

async {
    let image = await fetchImage()
    // Process image and update UI
}

3. Actors และบทบาท (role) ในการทำงานพร้อมกัน (concurrency)

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

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

actor TemperatureSensor {
    private var temperature: Double = 0.0

    func updateTemperature(newTemperature: Double) async {
        self.temperature = newTemperature
    }

    func readTemperature() async -> Double {
        return self.temperature
    }
}

async {
    let sensor = TemperatureSensor()
    await sensor.updateTemperature(newTemperature: 72.5)
    let currentTemperature = await sensor.readTemperature()
    print("Current temperature: \(currentTemperature)")
}

4. การยกเลิกงาน (Task cancellation) และลำดับความสำคัญ (priority)

ในการทำงานพร้อมกันของ Swift สามารถสร้างและจัดการงานได้โดยใช้โครงสร้างงาน งานมีลำดับความสำคัญและสามารถยกเลิกได้หากจำเป็น ให้การควบคุมโดยละเอียดสำหรับการดำเนินการพร้อมกันของคุณ

ลำดับความสำคัญของงานจะกำหนดลำดับในการดำเนินการงาน คุณสามารถกำหนดลำดับความสำคัญของงานโดยใช้เมธอด ‘withPriority’

Task.withPriority(.high) {
    // High-priority task
}

Task.withPriority(.low) {
    // Low-priority task
}

การยกเลิกงานทำให้คุณสามารถหยุดงานได้หากไม่จำเป็นอีกต่อไป ซึ่งอาจช่วยประหยัดทรัพยากรและปรับปรุงประสิทธิภาพโดยรวมของแอปพลิเคชันของคุณ หากต้องการยกเลิกงาน คุณต้องตรวจสอบการยกเลิกภายในงานโดยใช้คุณสมบัติ ‘Task.isCancelled’

func performCancellableTask() async {
    for i in 1...10 {
        if Task.isCancelled {
            print("Task cancelled")
            return
        }
        print("Iteration \(i)")
        await Task.sleep(1 * 1_000_000_000) // Sleep for 1 second
    }
}

let task = Task {
    await performCancellableTask()
}

// After 3 seconds, cancel the task
Task {
    await Task.sleep(3 * 1_000_000_000)
    task.cancel()
}

คุณสมบัติการทำงานพร้อมกัน (concurrency) ของ iOS Swift เช่น Grand Central Dispatch, DispatchQueue, async/await, การทำงานพร้อมกันที่มีโครงสร้าง, Actor และการจัดการงาน ช่วยให้การทำแอพมีเครื่องมือที่ทรงพลังและมีประสิทธิภาพในการทำแอพที่มีประสิทธิภาพสูงและตอบสนอง ด้วยการใช้ประโยชน์จากคุณสมบัติเหล่านี้ คุณสามารถทำแอพที่จัดการงานที่ซับซ้อนและใช้เวลานานได้อย่างง่ายดาย ทำให้มั่นใจได้ว่าผู้ใช้จะได้รับประสบการณ์ที่ราบรื่นและสนุกสนาน

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

เขียน App iOS Swift

ตอนที่ 7 iOS Swift แนวคิด Swift ขั้นสูง (Advanced Swift Concepts)
ตอนที่ 9 iOS Swift การจัดการหน่วยความจำ (Memory Management)