O que é Combine e para que serve?
\nCombine é um framework da Apple para programação reativa, apresentado em 2019 junto com o iOS 13. Ele fornece uma API declarativa em Swift para processar eventos ao longo do tempo. O Combine permite combinar operadores de processamento de eventos assíncronos em cadeias de processamento de dados (pipeline).
\nA principal tarefa do Combine é simplificar o trabalho com operações assíncronas: requisições de rede, notificações, KVO (Key-Value Observing), temporizadores, delegados e funções de callback. Em vez de mecanismos dispersos, o Combine oferece uma interface unificada baseada em Publisher (publicador) e Subscriber (assinante).
\nConceitos-chave:
\n- \n
- Publisher — fonte de dados que pode enviar valores e ser finalizada (com sucesso ou erro). \n
- Subscriber — receptor de dados que reage a eventos do Publisher. \n
- Operator — método que transforma, filtra ou combina fluxos de dados. \n
- Subscription — conexão entre Publisher e Subscriber que gerencia o fluxo de dados. \n
O Combine é fortemente integrado com SwiftUI e Foundation, tornando-o indispensável para aplicativos iOS modernos.
\n\nInstalação
\nCombine é um framework embutido da Apple. Para usá-lo, não é necessário instalar pacotes adicionais via CocoaPods, SPM ou Carthage. Ele está disponível a partir do iOS 13, macOS 10.15, tvOS 13 e watchOS 6.
\nPara começar a usar o Combine, basta importá-lo em um arquivo Swift:
\nimport Combine\nSe você usa o Swift Package Manager para gerenciar dependências, o Combine já está incluído na biblioteca padrão. Para projetos que suportam versões mais antigas do SO, você pode usar o OpenCombine — uma implementação open-source do Combine.
\nInstalação do OpenCombine via SPM:
\n// Em Package.swift\ndependencies: [\n .package(url: "https://github.com/CombineOpenSource/Combine.git", from: "0.5.0")\n]\n\nInício rápido com exemplo de código
\nVamos considerar um exemplo simples: criar um Publisher a partir de um array e assinar ele.
\nimport Combine\n\n// 1. Criando um Publisher a partir de um array\nlet publisher = [1, 2, 3, 4, 5].publisher\n\n// 2. Criando um Subscriber\nlet subscriber = Subscribers.Sink<Int, Never>(\n receiveCompletion: { completion in\n print("Finalizado: \\(completion)")\n },\n receiveValue: { value in\n print("Valor recebido: \\(value)")\n }\n)\n\n// 3. Assinando\npublisher.subscribe(subscriber)\nSaída no console:
\nValor recebido: 1\nValor recebido: 2\nValor recebido: 3\nValor recebido: 4\nValor recebido: 5\nFinalizado: finished\nUma forma mais idiomática usando o operador sink:
import Combine\n\nlet cancellable = [1, 2, 3, 4, 5].publisher\n .sink(receiveCompletion: { print($0) },\n receiveValue: { print($0) })\nObserve: sink retorna um AnyCancellable. Ele precisa ser mantido, caso contrário a assinatura será cancelada imediatamente após sair do escopo.
Métodos/funções principais
\n\n1. sink(receiveCompletion:receiveValue:)
\nO que faz: Cria um assinante que recebe todos os valores e a finalização do Publisher. Esta é a maneira mais simples de assinar um fluxo.
\nParâmetros:
\n- \n
receiveCompletion— closure chamada na finalização (com sucesso ou erro). RecebeSubscribers.Completion<Failure>. \n receiveValue— closure chamada ao receber cada novo valor. \n
Exemplo:
\nlet cancellable = Just("Hell Também na biblioteca
ring para Rust: guia completo com exemplos práticos
Validação de dados em C# (.NET): bibliotecas e abordagens
Cliente HTTP para Java: visão geral das principais bibliotecas (Java 11, Apache, OkHttp, Retrofit)