0Pricing
Swift Academy · Lektion

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

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