Swift Academy · Lektion

Scheduler und Threading

Steuern Sie die Ausführung mit receive(on:) und subscribe(on:).

Lektion 2 von 413 Schritte

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.

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 „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

  1. Streams transformieren und kombinieren
  2. Scheduler und Threading
  3. Operatoren zur Fehlerbehandlung
  4. Eigene Publisher und Subscriber
← Zurück zu Swift Academy