Interfaces reativas
com ReactiveUI no
Xamarin.Forms
Mahmoud Ali
@akamud
Developer @ Lambda3
Microsoft MVP
Interfaces Reativas
○ Usuários esperam interfaces reativas e respostas em
milisegundos e 100% de disponibilidade
○ Seu sistema precisa ser resistente a falhas
https://www.reactivemanifesto.org/pt-BR
Complexidades de interfaces reativas
○ Responsividade
○ Disponibilidade
○ Refresh instantâneo
○ Tratamento de erros
○ Carregamento
○ Políticas de retry
Reactive Extensions (Rx)
Reactive Extensions é uma biblioteca para compor programas
assíncronos e orientados a eventos utilizando observables e
operadores LINQ-style.
Reactive Extensions
○ Criado pela Microsoft pelo mesmo time de
desenvolvedores do LINQ
○ Conceitos de paradigma funcional
○ Utiliza o design pattern: Observer
○ Portada para várias linguagens: Javascript,
Java, Ruby, Python...
○ Todo baseado no conceito de streams
○ Possui uma série de operadores para
transformar streams
Erik Meijer
Streams
Streams
○ Funciona como uma esteira de produção
○ É uma sequência de eventos ordenados por tempo
○ É a base do Rx (Observable<T> no .NET)
○ É assíncrono e push-based
○ Podem ser transformados de diversas maneiras
Streams, só que mais vida loka
Streams
○ Quem quiser tratar o conteúdo que está passando pela
esteira precisa dar um subscribe
○ No padrão Observer: o stream (IObservable) é o subject, o
subscriber é o observer
○ Emite três estados: OnNext, OnError e OnCompleted
○ São imutáveis
○ São disposables
Streams
https://gist.github.com/staltz/868e7e9bc2a7b8c1f754
Síncrono x Assíncrono
Um item Múltiplos itens
Síncrono T Get() IEnumerable<T> Get()
Assíncrono Task<T> Get() Observable<T> Get()
Síncrono x Assíncrono - Pessoa
Um item Múltiplos itens
Síncrono Pessoa ObterPessoa()
IEnumerable<Pessoa>
ObterPessoas()
Assíncrono
Task<Pessoa>
ObterPessoa()
Observable<Pessoa>
ObterPessoas()
Streams
○ Tudo pode ser transformado em um stream:
○ Cliques de mouse
○ Teclas digitadas
○ Tasks assíncronas
○ Timers
○ Inclusive streams
Streams
https://gist.github.com/staltz/868e7e9bc2a7b8c1f754
Onde usar?
○ Eventos que dependem de infraestrutura (FileWatchers)
○ Eventos real-time
○ Eventos de UI
○ Streams (ex.: rede)
Quem usa?
Demo:
Reactive Extensions
Observable.Range
Throttle (debounce)
Buffer
ReactiveUI (RxUI)
○ Framework open source para facilitar a utilização de Reactive
Extensions na criação de interfaces reativas em qualquer
plataforma, reaproveitando código
ReactiveUI
○ Também é um framework MVVM
ReactiveUI
o Disponibiliza uma série de helpers para facilitar a criação das
interfaces:
• Bindings
• Ciclo de vida
• ObservableAsPropertyHelper
• ReactiveCommands
• ReactiveAdapters
“Mas o Xamarin.Forms já é um framework MVVM, eu
preciso de outro?
Demo:
ReactiveUI
Referências
○ The introduction to Reactive Programming you've been
missing
○ http://reactivex.io/
○ http://rxmarbles.com/
○ http://www.introtorx.com/
○ http://reactiveui.net/
○ https://bitbucket.org/achary/rx-marbles/
○ https://github.com/toggl/mobileapp/
○ https://github.com/akamud/XamarinForms.RxUI
Obrigado!
Perguntas?
@akamud

Interfaces reativas com ReactiveUI no Xamarin.Forms