Combine para Swift: guia completo com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

O que é Combine e para que serve?

\n

Combine é 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).

\n

A 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).

\n

Conceitos-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
\n

O Combine é fortemente integrado com SwiftUI e Foundation, tornando-o indispensável para aplicativos iOS modernos.

\n\n

Instalação

\n

Combine é 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.

\n

Para começar a usar o Combine, basta importá-lo em um arquivo Swift:

\n
import Combine
\n

Se 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.

\n

Instalaçã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\n

Início rápido com exemplo de código

\n

Vamos considerar um exemplo simples: criar um Publisher a partir de um array e assinar ele.

\n
import 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)
\n

Saída no console:

\n
Valor recebido: 1\nValor recebido: 2\nValor recebido: 3\nValor recebido: 4\nValor recebido: 5\nFinalizado: finished
\n

Uma forma mais idiomática usando o operador sink:

\n
import Combine\n\nlet cancellable = [1, 2, 3, 4, 5].publisher\n    .sink(receiveCompletion: { print($0) },\n          receiveValue: { print($0) })
\n

Observe: sink retorna um AnyCancellable. Ele precisa ser mantido, caso contrário a assinatura será cancelada imediatamente após sair do escopo.

\n\n

Métodos/funções principais

\n\n

1. sink(receiveCompletion:receiveValue:)

\n

O 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.

\n

Parâmetros:

\n
    \n
  • receiveCompletion — closure chamada na finalização (com sucesso ou erro). Recebe Subscribers.Completion<Failure>.
  • \n
  • receiveValue — closure chamada ao receber cada novo valor.
  • \n
\n

Exemplo:

\n
let cancellable = Just("Hell                    

Recommendations