0Pricing
Swift Academy · บทเรียน

ตัวตรวจสอบเธรดหลักและการค้าง

ตรวจหางาน UI บนเธรดเบื้องหลัง และแก้ปัญหาการค้างของเธรดหลัก

ตัวตรวจสอบเธรดหลักและการค้าง เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

ตัวตรวจสอบเธรดหลัก

ตัวตรวจสอบเธรดหลัก (MTC) คือเครื่องมือวินิจฉัยของ Xcode ที่รายงานการเรียก API ของ UIKit/AppKit จากเธรดเบื้องหลังระหว่างการทำงาน

// Enabled by default in Xcode Debug scheme:
// Product → Scheme → Edit → Diagnostics → ☑ Main Thread Checker
// Violating calls log a purple runtime warning in Xcode

การละเมิด MTC ที่พบบ่อย

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

URLSession.shared.dataTask(with: url) { data, _, _ in
  self.label.text = "Done"  // VIOLATION: background thread
}.resume()
// Fix:
DispatchQueue.main.async { self.label.text = "Done" }

MTC กับ async/await

การกำกับคลาสหรือฟังก์ชันด้วย @MainActor รับรองว่าเมธอดทั้งหมดของคลาสหรือฟังก์ชันนั้นจะทำงานบนเธรดหลัก

@MainActor
final class ProfileViewModel: ObservableObject {
  @Published var name = ""
  func load() async {
    name = try? await fetchName()  // always on main thread
  }
}

การค้างคืออะไร

การค้างเกิดขึ้นเมื่อเธรดหลักถูกบล็อกนานเกินไปจนแอปไม่ตอบสนอง ระบบเฝ้าระวังของ iOS จะยุติแอปที่ค้างขณะเปิดแอป (เกิน 20 วินาที) หรือหลังจากผู้ใช้ดำเนินการ

// Common causes:
// - Synchronous network calls on main thread
// - Heavy computation blocking main run loop
// - Deadlocks between DispatchQueues

เทมเพลตการค้างของ Instruments

เครื่องมือ Hangs ใน Xcode 14 ขึ้นไปจะบันทึกเหตุการณ์การค้างพร้อมสแต็กเทรซทั้งหมด เพื่อวินิจฉัยการบล็อกเธรดหลัก

// Instruments → Hangs template
// Shows hang duration (ms), call stack, and responsible frame
// Look for synchronous I/O or heavy loops

ตัวตรวจสอบเธรดหลักในการทดสอบ

MTC ทำงานระหว่างการทดสอบส่วนติดต่อผู้ใช้ด้วย คุณสามารถกำหนดค่าได้ในรูปแบบการทดสอบเพื่อจับการละเมิดระหว่างขั้นตอนส่วนติดต่อผู้ใช้แบบอัตโนมัติ

// XCTestScheme Diagnostics → ☑ Main Thread Checker
// UI test violation = instant fail in CI

รายงานการค้างของ MetricKit

MetricKit จะรวบรวมรายงานการค้างจากแอปในระบบใช้งานจริงไว้ใน MXHangDiagnosticPayload

func didReceive(_ payloads: [MXDiagnosticPayload]) {
  payloads.compactMap { $0.hangDiagnostics }.flatMap { $0 }.forEach {
    print($0.callStackTree)
  }
}

การตรวจจับการค้างด้วย Instruments

บันทึกข้อมูลติดตามการทำงาน แล้วมองหาช่วงเวลาที่เธรดหลักกำลังทำงาน แต่ตัวเชื่อมการแสดงผลไม่ทำงาน ซึ่งทำให้เฟรมตกหล่น

// Time Profiler: look for long CPU bursts on main thread
// Core Animation: FPS drops to 0 during hang
// Hangs instrument: highlights exact frames where hang occurred

การแก้ไขการค้างที่พบบ่อยด้วยอะซิงโครนัส

ย้ายงานที่ใช้ CPU มากออกจากเธรดหลักโดยใช้ Task.detached หรือ async let

// HANG:
let processed = heavyProcessing(image)  // blocks main thread
// FIX:
let processed = await Task.detached(priority: .userInitiated) {
  heavyProcessing(image)
}.value

การหลีกเลี่ยง API แบบซิงโครนัสบนเธรดหลัก

แทนที่การรับส่งข้อมูลไฟล์และการเรียกเครือข่ายแบบซิงโครนัสด้วยรูปแบบอะซิงโครนัสที่เทียบเท่า หรือย้ายการทำงานไปยังคิวเบื้องหลัง

// HANG: synchronous file read on main thread
let data = try! Data(contentsOf: largeFileURL)
// FIX:
let data = try await Task.detached { try Data(contentsOf: largeFileURL) }.value

ลูปการทำงานหลักและตัวจับเวลา

การทำงานที่ใช้เวลานานบนลูปการทำงานหลัก (ในคอลแบ็ก RunLoop.main) ก็ทำให้เกิดการค้างได้เช่นกัน ให้ย้ายการคำนวณออกจากลูปหลัก

// AVOID: heavy work in main-thread timer callback
Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { _ in
  processAllItems()  // slow!
}
// PREFER: dispatch to background
Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { _ in
  Task.detached { processAllItems() }
}

ตรวจสอบความเข้าใจ

การเพิ่ม @MainActor ให้กับคลาสรับรองอะไรเกี่ยวกับการเรียกใช้เมธอดของคลาสนั้น

ทบทวนบทเรียน

เปิดใช้ตัวตรวจสอบเธรดหลักในรูปแบบดีบักเพื่อจับการละเมิดที่ส่วนติดต่อผู้ใช้ทำงานจากเธรดเบื้องหลัง ใช้ @MainActor กับ ViewModels และมุมมอง ย้ายงานหนักออกจากเธรดหลักด้วย Task.detached หรือคิวเบื้องหลัง ใช้เครื่องมือ Hangs และ MXHangDiagnosticPayload ของ MetricKit เพื่อวินิจฉัยการค้างที่เกิดขึ้นในสถานการณ์จริง

คำถามที่พบบ่อย

บทเรียน “ตัวตรวจสอบเธรดหลักและการค้าง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตัวตรวจสอบเธรดหลักและการค้าง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ตัวตรวจสอบเธรดหลักและการค้าง”

ตรวจหางาน UI บนเธรดเบื้องหลัง และแก้ปัญหาการค้างของเธรดหลัก คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “ตัวตรวจสอบเธรดหลักและการค้าง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐาน Instruments: ตัววิเคราะห์เวลา
  2. Instruments สำหรับการจัดสรรและการรั่วไหล
  3. ตัวตรวจสอบเธรดหลักและการค้าง
  4. ปรับเส้นทางที่ใช้เวลามาก: COW การแทรกโค้ด และการปรับเฉพาะทาง
← กลับไปที่ Swift Academy