SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
21.11.2024

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:

  1. PassthroughSubject
  2. CurrentValueSubject
  3. 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!

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!