Você está na página 1de 3

Trabalhando com assuntos de publicação

Os assuntos de publicação são úteis quando você simplesmente deseja que os


assinantes sejam notificados sobre novos eventos a partir do ponto em que se
inscreveram, até que eles cancelem a inscrição ou o assunto seja encerrado com um
evento .completed ou .error.
No diagrama de mármore a seguir, a linha superior é o assunto da publicação e a
segunda e a terceira linhas são os assinantes. As setas apontando para cima indicam
assinaturas e as setas apontando para baixo representam eventos emitidos.
O primeiro assinante se inscreve depois que 1 é adicionado ao assunto, portanto, não
recebe esse evento. Mas dá 2 e 3. E como o segundo assinante não participa da
diversão até que 2 seja adicionado, ele recebe apenas 3.
Voltando ao playground, adicione o seguinte código na parte inferior do mesmo
exemplo:
Os eventos têm uma propriedade de elemento opcional que conterá o elemento
emitido
para .próximos eventos. Você usa o operador nil-coalescing aqui para imprimir o
elemento se houver um; caso contrário, você imprime o evento.
Como esperado, o subscriptionTwo ainda não imprime nada porque ele se inscreveu
depois que o 1 e o 2 foram emitidos. Agora adicione este código:
subject.onNext("3")

deixe assinaturaDois = assunto


.subscribe { evento em
print("2)", event.element ?? evento)
}}
72. raywenderlich. com
RxSwift - Programação reativa com Swift Capítulo 3: Assuntos O 3 é impresso duas
vezes, uma para assinaturaUm e outra para assinaturaDois.
Adicione este código para encerrar o subscriptionOne e, em seguida, adicione outro
evento .next ao assunto:
O valor 4 é impresso apenas para a assinatura 2), pois a assinaturaOne foi descartada.
2) 4
Quando um assunto de publicação recebe um evento .completed ou .error, também
conhecido como evento de parada, ele emitirá esse evento de parada para novos
assinantes e não emitirá mais eventos .next. No entanto, ele reemitirá seu evento de
parada para futuros assinantes. Adicione o seguinte código ao exemplo:
3
2) 3
subscriçãoOne.dispose()
assunto . onNext (" 4 " )
// 1
assunto . em Concluído ( )
// 2
subject.onNext("5")
// 3
subscriçãoDois.dispose()
vamos disporBag = DisposeBag()
// 4
sujeito
.se inscrever {
print("3)", $0.element ?? $ 0)
}}
.disposed(by:disposeBag)
subject.onNext("?")
Aqui está o que você fez:
1. Coloque um evento .completed no assunto, usando o método de conveniência para
em ( . concluído ) Isso efetivamente encerra a sequência observável do sujeito.
2. Adicione outro elemento ao assunto. Isso não será emitido e impresso, no entanto,
porque o assunto já terminou.
73. raywenderlich. com

RxSwift - Programação reativa com Swift Capítulo 3: Assuntos


3. Não se esqueça de descartar as assinaturas quando terminar!
4. Subscreva o assunto, desta vez juntando o seu descartável a um saco de eliminação.
Talvez o novo assinante 3) dê um pontapé inicial no assunto de volta à ação? Não, mas
você ainda recebe o evento .completed.
Na verdade, os assuntos, uma vez encerrados, reemitirão seu evento de parada para
futuros assinantes. Portanto, é uma boa ideia incluir manipuladores para interromper
eventos em seu código, não apenas para ser notificado quando ele terminar, mas
também no caso de já ter sido encerrado quando você se inscrever nele. Isso às vezes
pode ser a causa de bugs sutis, então cuidado!
Você pode usar um assunto de publicação ao modelar dados sensíveis ao tempo, como
em um aplicativo de lances online. Não faria sentido alertar o usuário que entrou às
10h01 que às 9h59 faltava apenas 1 minuto para o leilão. Isso, claro, a menos que você
goste de avaliações de 1 estrela para seu aplicativo de lances.
Às vezes, você deseja que os novos assinantes saibam qual foi o último elemento
emitido, mesmo que esse elemento tenha sido emitido antes da assinatura. Para isso,
você tem algumas opções.
Trabalhando com assuntos comportamentais
Os assuntos comportamentais funcionam de maneira semelhante aos assuntos de
publicação, exceto que eles reproduzirão o evento .next mais recente para novos
assinantes. Confira este diagrama de mármore:
2) concluído
3) concluído
74. raywenderlich. com

RxSwift - Programação reativa com Swift Capítulo 3: Assuntos


A primeira linha de cima é o assunto. O primeiro assinante na segunda linha assina
após 1, mas antes de 2, portanto, obtém 1 imediatamente após a assinatura e, em
seguida, 2 e 3 conforme são emitidos pelo assunto. Da mesma forma, o segundo
assinante se inscreve após 2, mas antes de 3, então recebe 2 imediatamente e depois
3 quando é emitido.
Adicione o seguinte código ao seu playground, após o último exemplo:
// 1
enum MeuErro: Erro {
caso um erro
}}
// 2
func print < T : CustomStringConvertible > ( label : String , event : Event < T > ) {
print(label,(evento.elemento??evento.erro)??evento)
}}
// 3
example(of: "BehaviorSubject") {
// 4
let subject = BehaviorSubject(value: "Valor inicial");
vamos disporBag = DisposeBag()
}}
Aqui está o jogo-a-jogo:
1. Defina um tipo de erro para usar nos próximos exemplos.
2. Expandindo o uso do operador ternário no exemplo anterior, você cria uma função
auxiliar para imprimir o elemento se houver um, um erro se houver um desses, ou
então o próprio evento. Quão conveniente!
3. Inicie um novo exemplo.
4. Crie um novo insta BehaviorSubject

Você também pode gostar