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
A Mensagem - Congestionamento Do Carro de Impressão - É Exibida Nas Impressoras E-Multifuncionais HP Officejet Pro Séries 8610, 8620, 8630, 8640 e 8660 - Suporte Da HP®