Main Thread Checker und Hänger
Erkennen Sie UI-Arbeiten in Hintergrund-Threads und beheben Sie Hänger des Haupt-Threads.
Main Thread Checker und Hänger ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Main Thread Checker
Der Main Thread Checker (MTC) ist ein Xcode-Diagnosewerkzeug, das zur Laufzeit UIKit-/AppKit-API-Aufrufe aus Hintergrundthreads meldet.
// Enabled by default in Xcode Debug scheme:
// Product → Scheme → Edit → Diagnostics → ☑ Main Thread Checker
// Violating calls log a purple runtime warning in XcodeHäufige MTC-Verstöße
Das Aktualisieren der Benutzeroberfläche aus Completion-Handlern oder Hintergrundwarteschlangen gehört zu den häufigsten Verstößen.
URLSession.shared.dataTask(with: url) { data, _, _ in
self.label.text = "Done" // VIOLATION: background thread
}.resume()
// Fix:
DispatchQueue.main.async { self.label.text = "Done" }MTC mit async/await
Wenn Sie eine Klasse oder Funktion mit @MainActor markieren, wird garantiert, dass alle ihre Methoden im Hauptthread ausgeführt werden.
@MainActor
final class ProfileViewModel: ObservableObject {
@Published var name = ""
func load() async {
name = try? await fetchName() // always on main thread
}
}Was sind Hangs?
Ein Hang liegt vor, wenn der Hauptthread zu lange blockiert ist und die App dadurch nicht mehr reagiert. Der iOS-Watchdog beendet Apps, die beim Start (>20 s) oder nach einer Benutzeraktion hängen.
// Common causes:
// - Synchronous network calls on main thread
// - Heavy computation blocking main run loop
// - Deadlocks between DispatchQueuesDas Hangs-Template von Instruments
Das Hangs-Instrument in Xcode 14 und neuer zeichnet Hang-Ereignisse mit vollständigen Stack Traces auf, um Blockierungen des Hauptthreads zu diagnostizieren.
// Instruments → Hangs template
// Shows hang duration (ms), call stack, and responsible frame
// Look for synchronous I/O or heavy loopsMain Thread Checker in Tests
Der MTC wird auch während UI-Tests ausgelöst. Konfigurieren Sie ihn im Testschema, um Verstöße in automatisierten UI-Abläufen zu erkennen.
// XCTestScheme Diagnostics → ☑ Main Thread Checker
// UI test violation = instant fail in CIHang-Berichte mit MetricKit
MetricKit erfasst Hang-Berichte von Apps in der Produktion in MXHangDiagnosticPayload.
func didReceive(_ payloads: [MXDiagnosticPayload]) {
payloads.compactMap { $0.hangDiagnostics }.flatMap { $0 }.forEach {
print($0.callStackTree)
}
}Hangs mit Instruments erkennen
Erstellen Sie eine Aufzeichnung und achten Sie auf Zeitintervalle, in denen der Hauptthread ausgeführt wird, der Display-Link jedoch nicht auslöst (übersprungene Frames).
// 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 occurredAsync-Lösungen für häufige Hangs
Verlagern Sie CPU-intensive Arbeit mit Task.detached oder async let aus dem Hauptthread.
// HANG:
let processed = heavyProcessing(image) // blocks main thread
// FIX:
let processed = await Task.detached(priority: .userInitiated) {
heavyProcessing(image)
}.valueSynchrone APIs im Hauptthread vermeiden
Ersetzen Sie synchrone Datei- und Netzwerkzugriffe durch asynchrone Varianten oder verschieben Sie sie in eine Hintergrundwarteschlange.
// HANG: synchronous file read on main thread
let data = try! Data(contentsOf: largeFileURL)
// FIX:
let data = try await Task.detached { try Data(contentsOf: largeFileURL) }.valueHaupt-Runloop und Timer
Auch lang laufende Vorgänge im Haupt-Runloop (in RunLoop.main-Callbacks) verursachen Hangs. Verlagern Sie Berechnungen aus dem Haupt-Runloop.
// 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() }
}Kurze Prüfung
Was wird garantiert, wenn Sie einer Klasse @MainActor hinzufügen?
Zusammenfassung der Lektion
Aktivieren Sie den Main Thread Checker im Debug-Schema, um UI-Zugriffe aus Hintergrundthreads zu erkennen. Verwenden Sie @MainActor für ViewModels und Views. Verlagern Sie aufwendige Arbeit mit Task.detached oder Hintergrundwarteschlangen aus dem Hauptthread. Verwenden Sie das Hangs-Instrument und MXHangDiagnosticPayload von MetricKit, um Hangs in der Praxis zu diagnostizieren.
Lerne Swift mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 122
- Lektionen
- 409
Häufig gestellte Fragen
Ist die Lektion „Main Thread Checker und Hänger“ kostenlos?
Ja — der vollständige Text von „Main Thread Checker und Hänger“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Main Thread Checker und Hänger“?
Erkennen Sie UI-Arbeiten in Hintergrund-Threads und beheben Sie Hänger des Haupt-Threads. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Swift Academy zu starten?
Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Main Thread Checker und Hänger“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?
Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Instruments-Grundlagen: Time Profiler
- Allocations- und Leaks-Instruments
- Main Thread Checker und Hänger
- Hot Paths optimieren: COW, Inlining und Spezialisierung