Swift Academy · Les

Aangepaste publishers en subscribers

Bouw uw eigen Combine-componenten.

Les 4 van 413 stappen

Aangepaste publishers en subscribers is een gratis Swift Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Swift Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Swift Academy bevat in totaal 4 lessen.

Naast ingebouwde publishers

Combine wordt geleverd met veel publishers, maar soms moet je een API die niet op Combine is gebaseerd omwikkelen als publisher, of waarden consumeren met nauwkeurige controle over backpressure. Dat betekent dat je de protocollen Publisher en Subscriber zelf implementeert.

Het Publisher-protocol

Een Publisher declareert zijn typen Output en Failure en implementeert receive(subscriber:), waarbij het een subscription doorgeeft aan de subscriber die zich aanmeldt.

protocol Publisher {
    associatedtype Output
    associatedtype Failure: Error
    func receive<S: Subscriber>(subscriber: S)
        where S.Input == Output, S.Failure == Failure
}

De rol van Subscription

Wanneer een subscriber zich koppelt, maakt de publisher een object van het type Subscription. De subscription vormt de verbinding die de vraag naar waarden beheert en waarden aflevert. Deze voldoet aan Subscription, dat Cancellable uitbreidt.

Een aangepaste Subscription

De subscription bewaart de subscriber en reageert op verzoeken om waarden door deze uit te sturen.

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

Een aangepaste Publisher

De publisher maakt eenvoudig de subscription aan en geeft deze via receive(subscription:) door aan de subscriber.

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 begrijpen

Backpressure is de stroomregeling van Combine. Een subscriber vraagt een bepaalde Demand op en de publisher mag niet meer waarden verzenden dan gevraagd. Door vanuit receive(_:) extra vraag terug te geven, vergroot je de toegestane hoeveelheid.

Het Subscriber-protocol

Een aangepaste Subscriber implementeert drie methoden: eerst ontvangt deze de subscription, daarna elke waarde en ten slotte een voltooiingsbericht.

protocol Subscriber {
    associatedtype Input
    associatedtype Failure: Error
    func receive(subscription: Subscription)
    func receive(_ input: Input) -> Subscribers.Demand
    func receive(completion: Subscribers.Completion<Failure>)
}

Een aangepaste Subscriber

Hier vraagt een subscriber vooraf twee waarden op en daarna nog één waarde voor elke ontvangen waarde, terwijl deze de waarden afdrukt.

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")
    }
}

Een delegate-API omwikkelen

Een praktische toepassing van aangepaste publishers is het verbinden van een delegate- of callback-API met Combine, zodat oude code kan worden gecombineerd. Je bewaart de subscriber en geeft delegate-callbacks door als aanroepen van receive(_:).

Gebruik subjects wanneer dat kan

De protocollen handmatig implementeren is zelden nodig. Voor de meeste verbindingen is een PassthroughSubject of CurrentValueSubject veel eenvoudiger — je roept gewoon send(_:) aan.

let subject = PassthroughSubject<Int, Never>()

subject
    .sink { print($0) }
    .store(in: &cancellables)

subject.send(1)
subject.send(2)

Wanneer maatwerk nodig is

Kies voor aangepaste implementaties van Publisher en Subscriber wanneer je het volgende nodig hebt:

  • Fijnmazige controle over backpressure
  • Een complexe bron die niet op Combine is gebaseerd efficiënt omwikkelen
  • Herbruikbare, typeveilige operators

In andere gevallen zijn subjects en ingebouwde operators de juiste hulpmiddelen.

Kennischeck

Toets je kennis van aangepaste publishers.

Samenvatting

Je hebt geleerd hoe je de kernprotocollen van Combine implementeert:

  • Publisher maakt voor elke subscriber een Subscription
  • De subscription houdt zich aan Demand (backpressure)
  • Subscriber ontvangt de subscription, waarden en voltooiing
  • Gebruik voor de meeste verbindingen liever subjects

Als je deze interne werking begrijpt, wordt duidelijker hoe Combine in zijn geheel werkt.

Gratis beginnen

Leer Swift met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
122
Lessen
409

Veelgestelde vragen

Is de les “Aangepaste publishers en subscribers” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad Swift Academy, waaronder “Aangepaste publishers en subscribers”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Swift Academy bevat in totaal 4 lessen.

Wat leer ik in “Aangepaste publishers en subscribers”?

Bouw uw eigen Combine-componenten. Je oefent met Swift Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Swift Academy te beginnen?

Ervaring vooraf is niet nodig. Swift Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.

Hoe lang duurt de les “Aangepaste publishers en subscribers”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Swift Academy?

Ja. Elke les over Swift Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Streams transformeren en combineren
  2. Schedulers en threading
  3. Operatoren voor foutafhandeling
  4. Aangepaste publishers en subscribers
← Terug naar Swift Academy