Resumo Básico de RxSwift

Hoff Silva
5 min readSep 13, 2019

--

Introdução

A intenção deste post é ajudar a esclarecer pontos básicos sobre o RxSwift, algo que senti dificuldades de encontrar no meu primeiro contato com o Rx. Espero que este artigo te ajude a entender melhor esse poderoso framework.

Quando comecei trabalhar com RxSwift, algumas perguntas ficavam martelando na minha cabeça:

Porque usar Rx?

O que ele faz que não podemos fazer com o KVO, com o Delegate ou com Observer(didSet, willSet)?

Conversando com amigos e lendo alguns livros, a conclusão que eu cheguei foi a seguinte:

Poupar trabalho.

O RxSwift nos permite tratar streams de eventos assíncronos de forma tão simples como tratamos arrays. O que livra dev de ter lidar com um emaranhado de callbacks tornando o código mais legível e com menos bugs.

Independente da sua "senioridade" ou tempo de experiência, acho que vale muito a pena aprender sobre essa simples, elegante e poderosa abstração de sequências chamada Rx.

Mas afinal, o que é RxSwift?

O RxSwift é uma implementação, em Swift, da lib ReactiveX. Esta lib é uma composição de programas assíncronos e de programas baseados em eventos utilizando sequências observáveis.

Essencialmente, o RxSwift é uma biblioteca que simplifica o desenvolvimento de código assíncrono que reage à novos dados que são processados sequencialmente e de forma isolada.

Minhas descobertas básicas

O RxSwift é baseado em 4 coisas Observables e Observers, Operators e Schedulers.

Observable

  • Um objeto genérico<T> que produz, assincronamente, uma sequência de eventos.
  • Possui três tipos de eventos: next, completed e error.
  • Possui dois tipos de sequências: finita e infinita.

Observer

  • É o objeto que se inscreve no observable para utilizar o elemento da sequência.

Operators

  • São métodos do protocolo ObservableType.
  • São bem parecidos com os métodos da programação funcional, Map(), Filter() e FlatMap().

Schedulers

  • São como o dispatch queues, mas melhorados e mais fáceis de usar.

Para usar o RxSwift, não é necessário alterar a arquitetura(MVVM,VIP, VIPER…) de um projeto.

Se for desenvolver um novo projeto e for usar o Rx, o recomendado pela comunidade é implementá-lo usando a arquitetura MVVM, mas é claro que a arquitetura vai depender mais do tamanho e da evolução do seu app.

RxCocoa fornece alguns comportamento de Rx para o UIKit.

Um pouco mais de Observable

Os observable são o cerne do RxSwift, na literatura você pode encontrar Observable Sequence e Sequence, todos são observables.

Um Observable não tipado não pode ser inferido, somos obrigados a definir um tipo na sua criação.

  • just — Este método é usado para criar uma sequência com apenas um elemento.
  • empty — Este método é usado para criar um Observable vazio.

Em RxSwift, tudo é uma sequência. Uma sequência de eventos.

Mas e o que é um evento?

Eventos são funções(closures) que recebem um dado genérico. Os Observables possuem 4 eventos:

  • next: chamado toda vez que um valor novo é adicionado ao Observable
  • completed: chamado toda vez que um Observable é finalizado
  • error: chamado quando um evento é encerrado devido a um erro.
  • dispose: chamado sempre que o Observable é desalocado da memória.

No código os eventos de Observable assim:

Diagrama de Marble

Para ilustrar o ciclo de vida de um Observable, utilizamos o Diagrama de Marble.

Explicação do Diagrama de Marble

Existem dois tipos de Observable, Finito e Infinito.

Infinito — É o Observable que nunca emite o evento completed. Um bom exemplo para este tipo de Observable é um observable do tipo Orientation que reage à orientação do device.

Finito — É o Observable que emite além do next ele emite o evento de completed, em caso de sucesso ou error, em caso de erro.

Evento Completed
Evento de Erro

Depois dessa introdução sobre o que é um Observable, vamos aprender sobre os tipos mais utilizados.

Os Subjects

  • Publish
  • Behavior
  • Replay
  • Variable(Deprecated)

A diferença entre um Subject e um Observable, é que o Subject atua como um Observable e um Observer ao mesmo tempo.

Mas o que é um Observer ?

Observer é um objeto que observa um Observable pra capturar o next/valor emitido por ele.

Vamos explicar melhor os Subjects

  • PublishSubjects

O PublishSubject começa vazio e só emite novos elementos para o seu observer(inscrito) quando recebe um novo conteúdo.

Em código ele fica basicamente assim:

Vamos ver esse código usando o diagrama de Marble:

  • BehaviorSubject

O BehaviorSubject começa com um elemento inicial e replica esse ou o último valor recebido para os inscritos.

Em código ele fica basicamente assim:

Vamos ver esse código usando o diagrama de Marble:

  • ReplaySubject

O ReplaySubject é iniciado com um tamanho pré-definido e vai mantendo esse tamanho e passando os valores para os inscritos. Esse tamanho serve pra armazenar os últimos valores emitidos pelo evento onNext.

Em código ele é basicamente assim:

Vamos ver esse código usando o diagrama de Marble:

DisposeBag

O DisposeBag é um tipo do RxSwift utilizado para desalocar o Observable da memória. Você pode fazer o dispose(desalocar) do Observable manual ou automaticamente.

No código fica assim:

O DisposeBag foi criado para evitar o vazamento de memória(memory leak), por isso é importante que você desaloque os objetos da memória após a sua utilização. Caso você esqueça, o compilador do Swift avisará que você tem objetos desalocáveis.

Conclusão

Como resumo, acho que o conteúdo deste post abrange direitinho a parte básica do RxSwift. Entendendo o conteúdo explicado aqui você consegue dar os primeiros passos no RxSwift.

Se você tiver algum comentário, correção ou qualquer outra coisa, não deixe de comentar aqui.

Referências

--

--