Scheduler und Threading
Steuern Sie die Ausführung mit receive(on:) und subscribe(on:).
Scheduler und Threading ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 2 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.
Scheduler in Combine
Ein Scheduler in Combine legt fest, wann und wo Arbeit ausgeführt wird – also welcher Thread oder welche Queue die Operatoren ausführt und Werte an Subscriber liefert.
Die Steuerung von Schedulern ist entscheidend, damit UI-Aktualisierungen im Hauptthread und aufwendige Arbeiten außerhalb davon ausgeführt werden.
Zwei wichtige Operatoren
Combine bietet zwei Operatoren zur Steuerung der Thread-Ausführung:
- subscribe(on:) – steuert, wo das Abonnement und die vorgelagerte Verarbeitung beginnen
- receive(on:) – steuert, wo nachgelagerte Werte zugestellt werden
Sie wirken an unterschiedlichen Enden der Pipeline.
receive(on:)
receive(on:) verschiebt alles danach auf den angegebenen Scheduler. Am häufigsten wird der Operator verwendet, um vor der Aktualisierung der Benutzeroberfläche zur Haupt-Queue zurückzuwechseln.
apiClient.fetchUser(id: 1)
.receive(on: DispatchQueue.main)
.sink { user in
self.nameLabel.text = user.name
}
.store(in: &cancellables)subscribe(on:)
subscribe(on:) steuert den Thread, auf dem der Publisher mit der Ausgabe beginnt und auf dem vorgelagerte Operatoren ausgeführt werden. Verwenden Sie den Operator, um aufwendige Vorbereitungen aus dem Hauptthread auszulagern.
heavyPublisher
.subscribe(on: DispatchQueue.global(qos: .userInitiated))
.receive(on: DispatchQueue.main)
.sink { result in
self.update(result)
}
.store(in: &cancellables)subscribe(on:) vs. receive(on:)
Merken Sie sich die Richtung:
- subscribe(on:) wirkt auf die vorgelagerte Verarbeitung – dort beginnt die Arbeit
- receive(on:) wirkt auf die nachgelagerte Verarbeitung – dort werden Ergebnisse zugestellt
Ein typisches Muster verwendet subscribe(on:) für die Hintergrundverarbeitung und receive(on:) für die Zustellung im Hauptthread.
DispatchQueue als Scheduler
DispatchQueue entspricht dem Scheduler-Protokoll. DispatchQueue.main liefert Werte im Hauptthread aus, während globale Queues im Hintergrund nebenläufig ausgeführt werden.
let background = DispatchQueue.global(qos: .background)
publisher
.map { expensiveTransform($0) }
.subscribe(on: background)
.receive(on: DispatchQueue.main)
.sink { self.render($0) }
.store(in: &cancellables)RunLoop als Scheduler
RunLoop ist ein weiterer Scheduler, der an den Run Loop eines Threads gebunden ist. RunLoop.main liefert Werte in Abstimmung mit UI-Ereignissen aus, was beispielsweise für die Reaktionsfähigkeit beim Scrollen relevant sein kann.
timerPublisher
.receive(on: RunLoop.main)
.sink { _ in
self.tick()
}
.store(in: &cancellables)DispatchQueue vs. RunLoop
Beide können Werte im Hauptthread ausliefern, unterscheiden sich jedoch in einigen Details:
- DispatchQueue.main – plant die Ausführung auch während der Scrollverfolgung
- RunLoop.main – verschiebt die Ausführung, während sich der Run Loop im Tracking-Modus befindet
Für die meisten UI-Aktualisierungen nach asynchroner Arbeit ist DispatchQueue.main die sicherere Standardeinstellung.
Scheduler-Operatoren für die Zeitsteuerung
Operatoren wie debounce, throttle und delay erhalten ein Scheduler-Argument, das festlegt, welche Queue ihre zeitgesteuerte Verarbeitung übernimmt.
searchTextPublisher
.debounce(for: .milliseconds(300), scheduler: DispatchQueue.main)
.sink { query in
self.runSearch(query)
}
.store(in: &cancellables)Ein häufiger Fehler bei der Thread-Ausführung
Wenn die Benutzeroberfläche außerhalb des Hauptthreads aktualisiert wird, kann es zu Abstürzen oder Darstellungsfehlern kommen. Wenn Sie nach einem Hintergrund-Publisher receive(on: DispatchQueue.main) vergessen, kann Ihr sink in einem Hintergrundthread ausgeführt werden.
Liefern Sie Werte, die für die Benutzeroberfläche bestimmt sind, immer über den Main-Scheduler aus.
Alles zusammenführen
Eine robuste Pipeline beginnt die Arbeit im Hintergrund, verarbeitet die Daten dort und liefert sie anschließend zur Anzeige an den Hauptthread.
imageURLPublisher
.subscribe(on: DispatchQueue.global())
.flatMap { url in downloadImage(url) }
.map { resize($0) }
.receive(on: DispatchQueue.main)
.sink { self.imageView.image = $0 }
.store(in: &cancellables)Kurze Überprüfung
Überprüfen Sie Ihr Wissen über Scheduler.
Zusammenfassung
Sie haben gelernt, die Thread-Ausführung in Combine zu steuern:
- subscribe(on:) – dort beginnt die vorgelagerte Verarbeitung
- receive(on:) – dort werden Ergebnisse zugestellt
- DispatchQueue und RunLoop als Scheduler
- Liefern Sie UI-Aktualisierungen immer im Hauptthread aus
Eine korrekte zeitliche Steuerung sorgt für reaktionsschnelle und absturzfreie Apps.
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 „Scheduler und Threading“ kostenlos?
Ja — der vollständige Text von „Scheduler und Threading“ 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 „Scheduler und Threading“?
Steuern Sie die Ausführung mit receive(on:) und subscribe(on:). 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 2 von 4.
Wie lange dauert die Lektion „Scheduler und Threading“?
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
- Streams transformieren und kombinieren
- Scheduler und Threading
- Operatoren zur Fehlerbehandlung
- Eigene Publisher und Subscriber