Comments 9

В корутинах есть важное преимущество перед операторами в RxJava/Reactor: все операторы могут быть асинхронными. Т.е. можно написать что-то вроде:


.map { httpUrl -> loadRemoteData(httpUrl }

Если loadRemoteData асинхронный, то можно делать неблокирующий pipe.


Однако есть еще важное отличие тех же корутин от RxJava/Reactor: корутины создаются "горячими" (сравнение горячих и холодных подписок). То есть когда вы возвращаете produce { ... }, вы можете начать публиковать данные до того, как на канал подпишутся.


В отличии от Kotlin Channels, в классических холодных Observable вы возвращаете класс, на который:


  • Пока не подпишутся — публикации не запустятся
  • Если будет пять подписчиков, то метод "onSubscribe" вызовется пять раз, т.е. будет пять независимых каналов. Однако в Channels все пятеро подпишутся на один канал и будут драться за данные
Корутины умеют приостанавливаться и буферизовать элемент потока до тех пор, пока предыдущий элемент не будет обработан, поэтому они автоматически решают проблему backpressure. Стоит глянуть вот этот пример, в котором это наглядно показано.
UFO landed and left these words here
Я верю, что код примеров можно улучшить, но в данном случае, это перевод и мной сохранена стилистика автора.

Автор — "Использование rxJava для вызова асинхронных методов — оверхед"
Тоже автор — "Тут я написал базовый класс для UseCase"

Как говорил известный нам Оби «Только ситхи все возводят в абсолют» или же любой метод имеет преимущества и недостатки.
Если рассматривать «RxJava» как единственное на чем замыкается данная технология то это изначально не правильный подход. «Rx» это гораздо большее чем одна библиотека. Rx поддерживает множество языков. Если вы переключаетесь между 3-4 языками каждый день то это достаточно экономит время на унификации подхода.

С помощью корутин вы можете выполнить все тоже самое (ну или почти тоже самое) что и с помощью Rx. Допустим Observable.withLatestFrom(Observable.timer(...), somePublishSubject). Мне кажется что данная конструкция на корутинах будет выглядеть слегка странно.

Однако, любая технология должна использоваться под нужны. Если в нашем приложении просто запросы на API и маппинг в обьект — зачем усложнять если корутины идут из коробки.

Обе технологии имеют право и место на существование.
Only those users with full accounts are able to leave comments. Log in, please.