Eigene Publisher und Subscriber
Erstellen Sie eigene Combine-Komponenten.
Eigene Publisher und Subscriber ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 4 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.
Über integrierte Publisher hinaus
Combine wird mit vielen Publishern ausgeliefert. Manchmal müssen Sie jedoch eine API, die nicht auf Combine basiert, als Publisher kapseln oder Werte mit präziser Kontrolle über backpressure verarbeiten. Dazu müssen Sie die Protokolle Publisher und Subscriber selbst implementieren.
Das Publisher-Protokoll
Ein Publisher deklariert seine Output- und Failure-Typen und implementiert receive(subscriber:). Dabei übergibt er dem ankommenden Subscriber eine Subscription.
protocol Publisher {
associatedtype Output
associatedtype Failure: Error
func receive<S: Subscriber>(subscriber: S)
where S.Input == Output, S.Failure == Failure
}Die Rolle der Subscription
Wenn ein Subscriber angehängt wird, erstellt der Publisher ein Subscription-Objekt. Die Subscription ist die Verbindung, die den Demand verwaltet und Werte übermittelt. Sie entspricht dem Protokoll Subscription, das Cancellable erweitert.
Eine eigene Subscription
Die Subscription speichert den Subscriber und reagiert auf Demand-Anfragen, indem sie Werte ausgibt.
final class CountSubscription<S: Subscriber>: Subscription
where S.Input == Int {
private var subscriber: S?
private var current = 0
init(subscriber: S) {
self.subscriber = subscriber
}
func request(_ demand: Subscribers.Demand) {
var remaining = demand
while remaining > 0 {
remaining -= 1
remaining += subscriber?.receive(current) ?? .none
current += 1
}
}
func cancel() {
subscriber = nil
}
}Ein eigener Publisher
Der Publisher erstellt einfach die Subscription und übergibt sie dem Subscriber über receive(subscription:).
struct CountPublisher: Publisher {
typealias Output = Int
typealias Failure = Never
func receive<S: Subscriber>(subscriber: S)
where S.Input == Int, S.Failure == Never {
let subscription = CountSubscription(subscriber: subscriber)
subscriber.receive(subscription: subscription)
}
}Demand verstehen
Backpressure ist die Flusssteuerung von Combine. Ein Subscriber fordert eine bestimmte Demand an, und der Publisher darf nicht mehr Werte senden als angefordert. Durch das Zurückgeben von Demand aus receive(_:) erhöht sich das verbleibende Kontingent.
Das Subscriber-Protokoll
Ein eigener Subscriber implementiert drei Methoden: Er empfängt die Subscription, anschließend jeden Wert und schließlich einen Abschluss.
protocol Subscriber {
associatedtype Input
associatedtype Failure: Error
func receive(subscription: Subscription)
func receive(_ input: Input) -> Subscribers.Demand
func receive(completion: Subscribers.Completion<Failure>)
}Ein eigener Subscriber
Dieser Subscriber fordert zunächst zwei Werte an und anschließend für jeden empfangenen Wert einen weiteren. Währenddessen gibt er die Werte aus.
final class PrintSubscriber: Subscriber {
typealias Input = Int
typealias Failure = Never
func receive(subscription: Subscription) {
subscription.request(.max(2))
}
func receive(_ input: Int) -> Subscribers.Demand {
print("Value:", input)
return .max(1)
}
func receive(completion: Subscribers.Completion<Never>) {
print("Done")
}
}Eine Delegate-API kapseln
Eine praktische Anwendung eigener Publisher besteht darin, eine Delegate- oder Callback-API in Combine zu integrieren, sodass Legacy-Code kombinierbar wird. Sie speichern den Subscriber und leiten Delegate-Aufrufe als receive(_:)-Aufrufe weiter.
Verwenden Sie Subjects, wenn möglich
Die Protokolle von Hand zu implementieren, ist nur selten nötig. Für die meisten Integrationen ist ein PassthroughSubject oder CurrentValueSubject deutlich einfacher — Sie rufen lediglich send(_:) auf.
let subject = PassthroughSubject<Int, Never>()
subject
.sink { print($0) }
.store(in: &cancellables)
subject.send(1)
subject.send(2)Wann Sie eigene Implementierungen verwenden sollten
Greifen Sie auf eigene Publisher-/Subscriber-Implementierungen zurück, wenn Sie Folgendes benötigen:
- Feingranulare Kontrolle über backpressure
- Eine komplexe Quelle außerhalb von Combine effizient kapseln
- Wiederverwendbare, typsichere Operatoren
Ansonsten sind Subjects und integrierte Operatoren das richtige Werkzeug.
Kurze Überprüfung
Testen Sie Ihr Wissen über eigene Publisher.
Zusammenfassung
Sie haben gelernt, die grundlegenden Combine-Protokolle zu implementieren:
- Publisher erstellt für jeden Subscriber eine Subscription
- Die Subscription berücksichtigt Demand (Backpressure)
- Subscriber empfängt Subscription, Werte und Abschluss
- Für die meisten Integrationsaufgaben sollten Sie Subjects bevorzugen
Wenn Sie diese Interna verstehen, wird die Funktionsweise von Combine insgesamt nachvollziehbarer.
Häufig gestellte Fragen
Ist die Lektion „Eigene Publisher und Subscriber“ kostenlos?
Ja — der vollständige Text von „Eigene Publisher und Subscriber“ 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 „Eigene Publisher und Subscriber“?
Erstellen Sie eigene Combine-Komponenten. 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 4 von 4.
Wie lange dauert die Lektion „Eigene Publisher und Subscriber“?
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