ตัวตรวจสอบเธรดหลักและการค้าง
ตรวจหางาน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐาน Instruments: ตัววิเคราะห์เวลา
- Instruments สำหรับการจัดสรรและการรั่วไหล
- ตัวตรวจสอบเธรดหลักและการค้าง
- ปรับเส้นทางที่ใช้เวลามาก: COW การแทรกโค้ด และการปรับเฉพาะทาง