Resumo Básico de RxSwift
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.
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.
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.