Size: a a a

Kotlin Community

2020 November 07

AN

Alexander Nozik in Kotlin Community
Yanis
Всем привет, у меня есть такая проблема с этим кодом

parentChannel.asFlow()
         .flatMapLatest( nextChannel1.asFlow() )
         .flatMapLatest( nextChannel2.asFlow() )
         .flatMapLatest(...)
         .collect { ... }

В parentChannel приходит значение, мы по цепочке ждем данные из nextChannel1/2 и вызывается collect
Ожидаемо если в nextChannel1/2 придут новые данные у нас отработает collect
И вот когда в parentChannel придет новое значение, я ожидаю что мы отпишемся от всех flatMapLatest и начнем ждать данные ТОЛЬКО из nextChannel1
Но у меня получается так, что от nextChannel2 отписка не происходит! Это нормальное поведение или я что-то делаю не так?
У меня есть такое ощущение, что вы совершенно не по назначению используете Flow. Для этого есть регулярные корутины и селекторы. Вы пытаетесь RX код переписать?
источник

Y

Yanis in Kotlin Community
Да, сделать по аналогии
источник

AN

Alexander Nozik in Kotlin Community
Yanis
Да, сделать по аналогии
(с) Вы так не делайте.

Почитайте тут: https://kotlinlang.org/docs/reference/coroutines/select-expression.html
источник

AN

Alexander Nozik in Kotlin Community
Вам надо сделать один Flow конструктор с селектором или даже без него, без всех этих flatMapLatest.
источник

LS

Leonard Startsev in Kotlin Community
Alexander Nozik
@sandwwraith У меня постоянно сериализация выжирает всю память:

[8.57M/ 92%/ 445MB]  3.2GB          1   ROOT: Static field: org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationComponentRegistrar.serializationDescriptorSerializer

Такое ощущение, что на JS IR. Я скинул уже несколько дампов. Но не могу понять, на чем именно это происходит.
Это должно быть починено в 1.4.30
источник

AN

Alexander Nozik in Kotlin Community
Leonard Startsev
Это должно быть починено в 1.4.30
О, супер.
источник

AN

Alexander Nozik in Kotlin Community
Leonard Startsev
Это должно быть починено в 1.4.30
А это действительно IR?
источник

LS

Leonard Startsev in Kotlin Community
Alexander Nozik
А это действительно IR?
Там на всех бекендах такая проблема,  кажется
источник

Y

Yanis in Kotlin Community
Alexander Nozik
Вам надо сделать один Flow конструктор с селектором или даже без него, без всех этих flatMapLatest.
Из каждого утюга заявляли что вот вам замена RX а тут такие сюрпризы вылазят
придется костылить что-то с "Вам надо сделать один Flow конструктор с селектором"
источник

AN

Alexander Nozik in Kotlin Community
Yanis
Из каждого утюга заявляли что вот вам замена RX а тут такие сюрпризы вылазят
придется костылить что-то с "Вам надо сделать один Flow конструктор с селектором"
Вы просто пытаетесь заменить кусок, которой на РХ крив со всех сторон. И на корутинах это можно сделать значительн окрасивее. Вы можете писать как на РХ, никто не мешает.
источник

Y

Yanis in Kotlin Community
значит я такого красивого способа не знаю
источник

AN

Alexander Nozik in Kotlin Community
Yanis
значит я такого красивого способа не знаю
Это не мешает узнать. По RX-style я к сожалению не могу подсказать.
источник

Y

Yanis in Kotlin Community
в той статье что вы скинули такой подход описан?
источник

AN

Alexander Nozik in Kotlin Community
Yanis
в той статье что вы скинули такой подход описан?
Это не статья, это кусок документации по селекторам. Я не уверен, что они вам нужны. Если у вас надо ждать, что придет первым nextChannel1 или nextChannel2, то это как раз кейс для селектов
источник

Y

Yanis in Kotlin Community
ждать не просто первым а подписаться, т.е. получать все значение из канала и реагировать на них по цепочке
источник

AN

Alexander Nozik in Kotlin Community
Yanis
ждать не просто первым а подписаться, т.е. получать все значение из канала и реагировать на них по цепочке
То есть надо по триггеру выбрать тот канал, по которому свалится первое событие и дальше читать только его?
источник

Y

Yanis in Kotlin Community
тот код что я скинул вроде должен быть понятен, по факту мы там слушаем одновременно 3 канала и если в один из них приходят данные, он отменяет все то что ниже
источник

Y

Yanis in Kotlin Community
еще я смотрел исходники flatMapLatest, там создается джоба которая отменяется когда приходят новые данные, но я не могу понять почему оно не отменяет дальше по цепочке
источник

Y

Yanis in Kotlin Community
возможно ли написать свой flatMapLatest с таким функционалом?
источник

AN

Alexander Nozik in Kotlin Community
Yanis
тот код что я скинул вроде должен быть понятен, по факту мы там слушаем одновременно 3 канала и если в один из них приходят данные, он отменяет все то что ниже
Он совершенно не очевиден тому, кто не привык городить это на RX. Я к сожалению не вижу расширений Flow для селекторов, но если бы были, это бы делалось через onReceive.
источник