При переходе с MVP на MVI очень спасает мини-библиотека kotlinx.coroutines.rx2.
Проект старый, весь код работающий с API в основном возвращает Rx-сущности. А методы Middleware в котором как раз мы и дергаем этот API, возвращает flow.
Поток данных внутри flow-билдера должен быть синхронным, что как раз и позволяет сделать эта маленькая библиотечка, добавляющая метод-расширение await() к SingleSource/CompletableSource/MaybeSource и тд. Внутри расширения используется блок suspendCancellableCoroutine, который оборачивает каллбеки Rx, возвращая результат.
В итоге, код будет выглядеть примерно так:
#MVI #Coroutines #Rx
Проект старый, весь код работающий с API в основном возвращает Rx-сущности. А методы Middleware в котором как раз мы и дергаем этот API, возвращает flow.
Поток данных внутри flow-билдера должен быть синхронным, что как раз и позволяет сделать эта маленькая библиотечка, добавляющая метод-расширение await() к SingleSource/CompletableSource/MaybeSource и тд. Внутри расширения используется блок suspendCancellableCoroutine, который оборачивает каллбеки Rx, возвращая результат.
В итоге, код будет выглядеть примерно так:
val response = interactor.apiRequest().await()
Крайне рекомендую, если у вас все еще смешанное использование Coroutines/Rx. #MVI #Coroutines #Rx
👍4🤔1
Marcin Moskala в своей книги Kotlin Coroutines Deep Dive наглядно показывает как устроены Flow под капотом:
Все гениальное просто 😎
#Coroutines #Flow
fun interface FlowCollector<T> {
suspend fun emit(value: T)
}
interface Flow<T> {
suspend fun collect(collector: FlowCollector<T>)
}
fun <T> flow(
builder: suspend FlowCollector<T>.() -> Unit
) = object : Flow<T> {
override suspend fun collect(
collector: FlowCollector<T>
) {
collector.builder()
}
}
suspend fun main() {
val f: Flow<String> = flow {
emit("A")
emit("B")
emit("C")
}
f.collect { print(it) } // ABC
f.collect { print(it) } // ABC
}
Все гениальное просто 😎
#Coroutines #Flow
❤2