0Pricing
Swift Academy · Lezione

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

  1. Trasformazione e combinazione degli stream
  2. Scheduler e threading
  3. Operatori per la gestione degli errori
  4. Publisher e subscriber personalizzati
← Torna a Swift Academy