Aangepaste publishers en subscribers
Bouw uw eigen Combine-componenten.
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.
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
- Streams transformeren en combineren
- Schedulers en threading
- Operatoren voor foutafhandeling
- Aangepaste publishers en subscribers