Swift Academy · Aula

Publishers e Subscribers Personalizados

Crie seus próprios componentes do Combine.

Aula 4 de 413 etapas

Publishers e Subscribers Personalizados é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 4 aulas no total.

Além dos publicadores integrados

O Combine vem com muitos publicadores, mas às vezes você precisa envolver uma API que não usa Combine como um publicador ou consumir valores com controle preciso de contrapressão. Isso significa implementar por conta própria os protocolos de publicador e assinante.

O protocolo de publicador

Um publicador declara seus tipos de Output e Failure e implementa receive(subscriber:), entregando uma assinatura ao assinante que está se conectando.

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

O papel da assinatura

Quando um assinante se conecta, o publicador cria um objeto de assinatura. A assinatura é o vínculo que gerencia a demanda e entrega valores. Ela está em conformidade com Subscription, que estende Cancellable.

Uma assinatura personalizada

A assinatura armazena o assinante e responde às solicitações de demanda emitindo valores.

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

Um publicador personalizado

O publicador simplesmente cria a assinatura e a entrega ao assinante por meio de 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)
    }
}

Entendendo a demanda

Contrapressão é o controle de fluxo do Combine. Um assinante solicita uma certa Demand, e o publicador não deve enviar mais valores do que os solicitados. Retornar demanda de receive(_:) aumenta o limite permitido.

O protocolo de assinante

Um assinante personalizado implementa três métodos: recebe a assinatura, depois cada valor e, por fim, uma conclusão.

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

Um assinante personalizado

Aqui, um assinante solicita inicialmente dois valores, depois mais um para cada valor recebido, imprimindo-os à medida que os recebe.

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

Envolvendo uma API de delegado

Uma aplicação prática de publicadores personalizados é fazer a ponte entre uma API de delegado ou de retorno de chamada e o Combine, para que o código legado se torne combinável. Você armazena o assinante e encaminha os retornos de chamada do delegado como chamadas a receive(_:).

Prefira sujeitos quando possível

Implementar os protocolos manualmente raramente é necessário. Para a maioria das integrações, um PassthroughSubject ou CurrentValueSubject é muito mais simples — basta chamar send(_:).

let subject = PassthroughSubject<Int, Never>()

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

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

Quando usar implementações personalizadas

Recorra a implementações personalizadas de publicador e assinante quando precisar de:

  • Controle detalhado de contrapressão
  • Uma forma eficiente de envolver uma fonte complexa que não usa Combine
  • Operadores reutilizáveis e com segurança de tipos

Caso contrário, sujeitos e operadores integrados são a ferramenta adequada.

Verificação rápida

Teste seus conhecimentos sobre publicadores personalizados.

Recapitulação

Você aprendeu a implementar os principais protocolos do Combine:

  • Publicador cria uma assinatura para cada assinante
  • A assinatura respeita a demanda (contrapressão)
  • Assinante recebe a assinatura, os valores e a conclusão
  • Prefira sujeitos para a maioria das necessidades de integração

Entender esses detalhes internos esclarece como todo o Combine funciona.

Grátis para começar

Aprenda Swift com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
122
Aulas
409

Perguntas Frequentes

A aula “Publishers e Subscribers Personalizados” é grátis?

Sim — o texto completo de “Publishers e Subscribers Personalizados” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 4 aulas no total.

O que vou aprender em “Publishers e Subscribers Personalizados”?

Crie seus próprios componentes do Combine. Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Swift Academy?

Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Publishers e Subscribers Personalizados”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Swift Academy?

Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Transformação e Combinação de Fluxos
  2. Agendadores e Execução em Threads
  3. Operadores de Tratamento de Erros
  4. Publishers e Subscribers Personalizados
← Voltar para Swift Academy