Publisher e subscriber personalizzati
Crei i tuoi componenti Combine.
Publisher e subscriber personalizzati è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 4 lezioni in totale.
Oltre i publisher integrati
Combine include numerosi publisher, ma a volte è necessario racchiudere un'API non-Combine in un publisher oppure consumare valori con un controllo preciso del backpressure. Ciò significa implementare personalmente i protocolli Publisher e Subscriber.
Il protocollo Publisher
Un Publisher dichiara i propri tipi Output e Failure e implementa receive(subscriber:), tramite cui consegna una subscription al subscriber in arrivo.
protocol Publisher {
associatedtype Output
associatedtype Failure: Error
func receive<S: Subscriber>(subscriber: S)
where S.Input == Output, S.Failure == Failure
}Il ruolo della Subscription
Quando un subscriber si collega, il publisher crea un oggetto Subscription. La subscription è il collegamento che gestisce la domanda e consegna i valori. È conforme a Subscription, che estende Cancellable.
Una Subscription personalizzata
La subscription memorizza il subscriber e risponde alle richieste di domanda emettendo valori.
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
}
}Un Publisher personalizzato
Il publisher crea semplicemente la subscription e la passa al subscriber tramite 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)
}
}Capire la domanda
Backpressure è il meccanismo di controllo del flusso di Combine. Un subscriber richiede una certa Demand e il publisher non deve inviare più valori di quelli richiesti. Restituire domanda da receive(_:) aumenta il limite disponibile.
Il protocollo Subscriber
Un Subscriber personalizzato implementa tre metodi: riceve la subscription, poi ogni valore e infine un completamento.
protocol Subscriber {
associatedtype Input
associatedtype Failure: Error
func receive(subscription: Subscription)
func receive(_ input: Input) -> Subscribers.Demand
func receive(completion: Subscribers.Completion<Failure>)
}Un Subscriber personalizzato
In questo esempio, un subscriber richiede inizialmente due valori, poi ne richiede uno in più per ogni valore ricevuto e li stampa man mano.
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")
}
}Racchiudere un'API basata su delegate
Un uso pratico dei publisher personalizzati consiste nel collegare un'API basata su delegate o callback a Combine, rendendo componibile il codice legacy. Si memorizza il subscriber e si inoltrano le callback del delegate come chiamate a receive(_:).
Preferisca i subject quando possibile
Implementare manualmente i protocolli è raramente necessario. Per la maggior parte dei collegamenti, un PassthroughSubject o un CurrentValueSubject è molto più semplice: basta chiamare send(_:).
let subject = PassthroughSubject<Int, Never>()
subject
.sink { print($0) }
.store(in: &cancellables)
subject.send(1)
subject.send(2)Quando scegliere un'implementazione personalizzata
Scelga implementazioni personalizzate di Publisher/Subscriber quando ha bisogno di:
- Un controllo dettagliato del backpressure
- Racchiudere in modo efficiente una sorgente non-Combine complessa
- Operatori riutilizzabili e sicuri rispetto ai tipi
Altrimenti, i subject e gli operatori integrati sono lo strumento giusto.
Verifica rapida
Metta alla prova le Sue conoscenze sui publisher personalizzati.
Riepilogo
Ha imparato a implementare i protocolli fondamentali di Combine:
- Publisher crea una Subscription per ogni subscriber
- La subscription rispetta la Demand (backpressure)
- Subscriber riceve la subscription, i valori e il completamento
- Preferisca i subject per la maggior parte delle esigenze di collegamento
Comprendere questi dettagli interni rende più chiaro il funzionamento di Combine nel suo complesso.
Domande Frequenti
La lezione «Publisher e subscriber personalizzati» è gratuita?
Sì — il testo completo di «Publisher e subscriber personalizzati» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 4 lezioni in totale.
Cosa imparerò in «Publisher e subscriber personalizzati»?
Crei i tuoi componenti Combine. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Swift Academy?
Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Publisher e subscriber personalizzati»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Swift Academy?
Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Trasformazione e combinazione degli stream
- Scheduler e threading
- Operatori per la gestione degli errori
- Publisher e subscriber personalizzati