Lição 94: Assuntos e Operadores no Combine
Combine é a estrutura da Apple para trabalhar com eventos assíncronos de forma declarativa. Nesta lição, vamos explorar o conceito de assuntos e operadores no Combine.
O que são Assuntos?
Assuntos no Combine atuam como pontes entre o publicador e o assinante. Eles podem ser considerados tanto publicadores quanto assinantes. Um assunto pode emitir eventos para seus assinantes e também pode receber eventos de outros publicadores. Existem três tipos principais de assuntos no Combine:
- PassthroughSubject
- CurrentValueSubject
- ReplaySubject (não fornecido no Combine, mas pode ser simulado usando operadores)
PassthroughSubject
PassthroughSubject
é um assunto simples que pode enviar valores. Ele não mantém nenhum valor, o que significa que, se um assinante se inscrever após um valor ter sido emitido, não receberá esse valor.
Exemplo:
import Combine
// Criar um PassthroughSubject
let subject = PassthroughSubject<String, Never>()
// Assinante
let cancellable = subject.sink { value in
print("Valor recebido: \(value)")
}
// Enviar um valor
subject.send("Olá, Combine!") // Saída: Valor recebido: Olá, Combine!
// Agora é tarde demais para receber este valor
subject.send("Adeus!") // Saída: Valor recebido: Adeus!
CurrentValueSubject
CurrentValueSubject
, por outro lado, mantém um valor atual que pode ser acessado a qualquer momento. Ao criar um CurrentValueSubject
, você deve inicializá-lo com um valor inicial. Seus assinantes receberão o valor atual imediatamente ao se inscreverem.
Exemplo:
import Combine
// Criar um CurrentValueSubject com um valor inicial
let currentSubject = CurrentValueSubject<String, Never>("Valor Inicial")
// Assinante
let cancellableCurrent = currentSubject.sink { value in
print("Valor atual: \(value)")
}
// Enviar um novo valor
currentSubject.send("Novo Valor") // Saída: Valor atual: Novo Valor
// Verificar o valor atual
print("O Valor Atual é: \(currentSubject.value)") // Saída: O Valor Atual é: Novo Valor
Usando Operadores com Assuntos
Os operadores permitem manipular ou transformar os dados emitidos por publicadores. Vamos revisar alguns operadores comuns em combinação com nossos assuntos.
Operador Map
O operador map
transforma os valores emitidos por um publicador.
import Combine
let numberSubject = PassthroughSubject<Int, Never>()
let cancellableMap = numberSubject
.map { "\($0 * 2)" }
.sink { value in
print("Valor Mapeado: \(value)")
}
numberSubject.send(1) // Saída: Valor Mapeado: 2
numberSubject.send(2) // Saída: Valor Mapeado: 4
Operador Filter
O operador filter
permite que você apenas passe valores que atendam a certos critérios.
let evenNumberSubject = PassthroughSubject<Int, Never>()
let cancellableFilter = evenNumberSubject
.filter { $0 % 2 == 0 }
.sink { value in
print("Número Par: \(value)")
}
evenNumberSubject.send(1) // Sem saída
evenNumberSubject.send(2) // Saída: Número Par: 2
evenNumberSubject.send(3) // Sem saída
evenNumberSubject.send(4) // Saída: Número Par: 4
Conclusão
Nesta lição, aprendemos sobre os assuntos no Combine, especificamente o PassthroughSubject
e o CurrentValueSubject
. Também exploramos como usar operadores como map
e filter
para manipular dados emitidos por assuntos. Essas são ferramentas poderosas para gerenciar e responder a eventos assíncronos em suas aplicações.
Você pode experimentar diferentes assuntos e operadores para ver como eles se encaixam melhor no seu fluxo de dados baseado em Combine. Boa programação!