Comparando RXSwift e Combine

Anthony M. Gianeli
Academy@EldoradoCPS
6 min readAug 28, 2020

Nesse artigo vou falar um pouco sobre RXSwift e Combine e comparar esses dois frameworks destacando suas diferenças.

Eu estava lendo sobre programação reativa e encontrei um termo muito interessante e que nunca tinha escutado e resolvi saber mais sobre ele, que seria o tal de Futures. O que quer dizer afinal? Futures são ações executadas sobre um valor retornado assincronamente, ou seja, executada futuramente quando este valor retorna (dai seu nome). Futures permitem não só tratar um valor como tratar erros que ocorram durante sua geração. E o que tem de importante isso? Ao trabalhar com Futures estamos trabalhando de uma forma “reativa”. Futures retornam um valor em um momento futuro, ou melhor, são uma “promessa” de retornar um valor de dado tipo, por isso também são chamadas às vezes de Promises. Esses Futures são ações futuras que se responsabilizam de fazer seu trabalho de forma assíncrona assim como do seu tratamento de erros.

A ideia básica da programação reativa é que se trabalha em cima de streams de dados. Cada stream é uma sequência de eventos que acontecem em uma certa linha do tempo que podem retornar um valor, um erro ou um sinal de verificação.

A programação reativa é baseados em eventos utilizando sequencias observáveis, simplificando assim o desenvolvimento de código assíncrono que reage aos novos dados que são processados sequencialmente, de forma isolada. Uma ferramenta muito utilizada para se entender como funciona o fluxo de informações na programação reativa são os diagramas de Marble.

Agora vou mostrar alguns exemplos utilizando o diagrama de Marble:

Aqui vemos uma sequencia de eventos, do evento 1 ao evento 5, sendo realizada de modo sequencial e assincronamente.

Agora temos um caso que após a realização de todos os eventos ocorreu um erro(onError( )), assim sendo encerrado o processo.

E a seguir temos o caso de sucesso de todos os eventos e sendo completado.

Nesse caso temos uma função de Filter que filtra alguns eventos da primeira sequencia de eventos e cria uma nova sequencia de eventos.

Mas esses são apenas alguns exemplos básicos de com ose utilizar o diagrama de Marble, existe muitas outras formas de se utiliza-lo.

O que é RXSwift?

É um framework desenvolvido se baseando em programação reativa, com o objetivo otimizar o desenvolvimento. A unidade básica de computação do modelo é a interface Observable<T> que define um fluxo de valores através do tempo. Os Observables funcionam de forma assíncrona.

O que é o Combine?

É um framework nativo que te deixa personalizar o tratamento de eventos assíncronos combinando operadores de processamento de eventos. Os valores que o Combine processa ao longo do tempo podem representar muitos tipos de eventos assíncronos: ele declara que os editores exponham valores que podem mudar com o tempo e que os assinantes recebam esses valores dos editores. Além do mais, o Combine torna o código mais fácil de ler e manter, centralizando o código de processamento e eliminando técnicas problemáticas como fechamento aninhados e retornos de chamadas baseados em convenção.

Combine x RXSwift?

Os dois frameworks são utilizados pela mesma razão, que seria expressar facilmente os fluxos de dados assíncronos, avaliando-os automaticamente e propagando as alterações dos dados. Assim, os códigos de processamento de eventos se tornam mais fáceis de ler e manter. Mas quais são as diferenças entre os dois?

  • O RXSwift é baseado em Observables e Observers. O Combine ja é baseado em Publisher e Subscriber. O Observables e o Observer do RXSwift representam o Publisher e Subscriber no Combine, respectivamente. Essas diferenças entre os dois é muito importante caso tenha vontade de migrar de um para o outro, para conseguir fazer as alterações necessárias.
  • Tipos e tratamentos de erros: o Observable do RXSwift e o Publisher do Combine, tem o mesmo propósito. Mas, se olharmos as especificações de seu protocolo, podemos perceber uma grande diferença: um tipo de erro adicional. No Combine, todo Publisher precisa definir seu tipo de erro; já o Observable do RXSwift não usa um tipo de erro específico, ele pode gerar qualquer tipo de erro a qualquer momento. Pode parecer que o RXSwift seja bem mais fácil de se utilizar, no entanto, precisamos sempre tratar o retorno do erro para não ocorrer nenhum problema.
  • O Combine foi projetado para ter o melhor desempenho possível. Ele oferece enormes benefícios de desempenho em comparação com RXSwift. Em um teste realizado pelo quickbirdstudios comparando o Combine com o RXSwift, pude notar nos resultados obtidos, que o Combine obteve uma média 41% de desempenho a mais que o RXSwift.
  • O Combine é compatível apenas com versões a partir do iOS 13 / macOS Catalina, enquanto o RXSwift é compatível a partir do iOS 8. Como a Apple esse ano declarou que todos os apps deveriam ser somente a partir do iOS 13 para conseguir colocar o app na loja, este problema acabou sendo automaticamente resolvido.
  • O Combine oferece a contrapressão igual o RXJava. Mas para que serve a Contrapressão? Ela permite que componentes que não consigam consumir itens com rapidez suficiente comuniquem sua situação aos componentes anteriores, fazendo com que eles lidem com a situação e reduzam a carga dos componentes consumidos. Com isso, evita-se que os componentes sob estresse eliminem mensagens de maneira descontrolada ou falhem. O RXSwift não tem este recurso ou qualquer alternativa parecida, portanto tem possibilidade de perder alguns dados em alta demanda.
  • O Combine não consegue oferecer a mesma quantidade de componentes e operadores igual o RXSwift tem disponível. Mas isso necessariamente não é algo ruim para o Combine, porque ele tenta se concentrar nos componentes principais da programação reativa e exclui operadores e componentes que não se precisa com tanta frequência, tornando mais fácil o entendimento da estrutura e elimina muitas complexidades desnecessárias. Mas nada elimina do Combine futuramente ter mais componentes para se trabalhar, pois ele ainda é muito novo e terá ainda no futuro muitas melhorias.

Agora para se usar a programação reativa em seu projeto será necessário alguma forma de vincular o seu fluxo à sua UI. No caso do RXSwift se tem o RXCocoa, que permite que seja vinculado o seu fluxo reativo à suas vizualizações, assim tendo um fluxo completo. O Combine esta fortemente ligado ao SwiftUI e consegue interagir muito bem entre eles. Mas, os dois são muito novos ainda, e como os dois dependem do versão iOS13 ou superior, ainda pode demorar um pouco para ele ser a principal escolha para um desenvolvimento.

Portanto como podemos observar algumas semelhanças entre os dois, mas se você quer desenvolver de modo reativo, a melhor escolha nesse momento pode ser RXSwift, pois o Combine e o SwiftUI são frameworks muito novos. Em meu ponto de vista acredito que o RXSwift seja possível ser utilizado com o SwiftUI, mas o Combine acredito não seja compatível com o CocoaRx, pois o Combine foi algo desenvolvido para ser integrado com o SwiftUI.

--

--