Publishers e Subscribers Personalizados
Crie seus próprios componentes do Combine.
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.
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
- Transformação e Combinação de Fluxos
- Agendadores e Execução em Threads
- Operadores de Tratamento de Erros
- Publishers e Subscribers Personalizados