Swift Academy · Lektion

Main Thread Checker und Hänger

Erkennen Sie UI-Arbeiten in Hintergrund-Threads und beheben Sie Hänger des Haupt-Threads.

Lektion 3 von 413 Schritte

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 Xcode

Hä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 DispatchQueues

Das 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 loops

Main 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 CI

Hang-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 occurred

Async-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)
}.value

Synchrone 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) }.value

Haupt-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.

Kostenlos starten

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

  1. Instruments-Grundlagen: Time Profiler
  2. Allocations- und Leaks-Instruments
  3. Main Thread Checker und Hänger
  4. Hot Paths optimieren: COW, Inlining und Spezialisierung
← Zurück zu Swift Academy