Size: a a a

Kotlin Community

2020 March 05

AN

Alexander Nozik in Kotlin Community
Alex F.
Всем привет. У меня кейс когда Flow эммиитит данные, и в одном из операторов происходит их сортировка на дефолтном диспатчере.
Не могу никак нормально придумать, как подменять компаратор если пользователь выбрал в UI новый тип сортировки.
Какое отношение сортировка имеет к корутинам?
источник

M

Mulle➊ne in Kotlin Community
Anatolii K
So what the problem to drop one of that enums?
They have different representations and there isn't a general name to encompass both...
источник

M

Mulle➊ne in Kotlin Community
trashkalmar
Have you tried Sealed classes?
I did read a bit about them, however the project is keen on keeping enums
источник

QH

Quantum Harmonizer in Kotlin Community
Mulle➊ne
They have different representations and there isn't a general name to encompass both...
where their representations differ?
источник

M

Mulle➊ne in Kotlin Community
as in they represent different data sets
источник

IK

Igor Komarov in Kotlin Community
Quantum Harmonizer
where their representations differ?
It's meant that they represent different entities, and there is no common generalization that would be able to serve as an adequate name
источник

AF

Alex F. in Kotlin Community
Alexander Nozik
Какое отношение сортировка имеет к корутинам?
Никакого не имееет. Вопрос был в том, как менять логику внутри Flow.
Я в итоге сдалал ConflatedBroadcastChannel, и посылаю в него сообщение, когда пользователь сделал определенное действие.
А внутри Flow который эммитит основной поток данных я сделал   combine(сonflatedBroadcastChannel.asFlow()) и меняю там логику.
Все работает нормально, пока в оригинальном потоке не становится очень много данных, и собщение из канала просто перестает доходить, видимо так как диспатчер перегружен.
источник

AF

Alex F. in Kotlin Community
У меня источник данных это callbackFlow и в него данные пишет WebSocket.
Частота получения данных довольно большая (каждый из нескольки тысяч элементов может присылать апдейт раз в секунду). У меня стоит samle(1000) чтобы до него данные групировались, и та самая сортировка выполнялась только раз в секунду. Но это всё равно до оператора sample() эммитится очень много событий.
Я полагаю, что они и загружают диспатчер.
источник

AF

Alex F. in Kotlin Community
Уже два дня бьюсь над этой проблемой.
источник

V

Vladimir in Kotlin Community
Alex F.
Никакого не имееет. Вопрос был в том, как менять логику внутри Flow.
Я в итоге сдалал ConflatedBroadcastChannel, и посылаю в него сообщение, когда пользователь сделал определенное действие.
А внутри Flow который эммитит основной поток данных я сделал   combine(сonflatedBroadcastChannel.asFlow()) и меняю там логику.
Все работает нормально, пока в оригинальном потоке не становится очень много данных, и собщение из канала просто перестает доходить, видимо так как диспатчер перегружен.
Используйте flow, вместо conflatedBroadcastChannel. callbackFlow думаю Вам лучше всего подойдёт. Ознакомьтесь подробнее с докой по conflatedBroadcastChannel. В этом канале до потребителя гарантированно доходит только последнее значение
источник

AN

Alexander Nozik in Kotlin Community
Alex F.
Никакого не имееет. Вопрос был в том, как менять логику внутри Flow.
Я в итоге сдалал ConflatedBroadcastChannel, и посылаю в него сообщение, когда пользователь сделал определенное действие.
А внутри Flow который эммитит основной поток данных я сделал   combine(сonflatedBroadcastChannel.asFlow()) и меняю там логику.
Все работает нормально, пока в оригинальном потоке не становится очень много данных, и собщение из канала просто перестает доходить, видимо так как диспатчер перегружен.
Я не понял, что означает менять логику внутри Flow. Есть map, если надо один в один отображать, если надо делать какие-то более сложные штуки, есть collect{}
источник

AF

Alex F. in Kotlin Community
Vladimir
Используйте flow, вместо conflatedBroadcastChannel. callbackFlow думаю Вам лучше всего подойдёт. Ознакомьтесь подробнее с докой по conflatedBroadcastChannel. В этом канале до потребителя гарантированно доходит только последнее значение
Меня устривает получать последнее значение. Проблема в том, что оно не обновляется.  Да и тот-же callbackFlow внутри себя channel использует
источник

AF

Alex F. in Kotlin Community
Alexander Nozik
Я не понял, что означает менять логику внутри Flow. Есть map, если надо один в один отображать, если надо делать какие-то более сложные штуки, есть collect{}
У меня в map и происходит сортировка. Но компаратор надо иногда менять, в зависимости от действий пользователя.
Про сложные штуки в collect не очень понял. Collect же у меня вызывается в конце, когда все данные обработаны.
источник

AN

Alexander Nozik in Kotlin Community
Alex F.
У меня в map и происходит сортировка. Но компаратор надо иногда менять, в зависимости от действий пользователя.
Про сложные штуки в collect не очень понял. Collect же у меня вызывается в конце, когда все данные обработаны.
вы можете вызвать коллект и перегенерить новый flow в нем
источник

AN

Alexander Nozik in Kotlin Community
Просто если вы сортируете элементы самого flow - это терминальная операция. Я все еще не очень понял задачу на самом деле
источник

AF

Alex F. in Kotlin Community
Alexander Nozik
Просто если вы сортируете элементы самого flow - это терминальная операция. Я все еще не очень понял задачу на самом деле
да, я сортирую элементы самого флоу.
Но к сожалению мне они приходят по одному, и сначал в одном map я дописываю их во внешнюю коллекцию (относительно Flow). Потом идет sample(1000). И далее вызывается еще один map который отсортирует накопившиеся данные.
Я явно что-то делаю не так...
источник

AN

Alexander Nozik in Kotlin Community
Ну так вы делаете терминальную операцию. Вы должны собрать все элементы, отсортировать и зафигачить новый флоу или передать их как коллекцию
источник

AF

Alex F. in Kotlin Community
Я не могу собрать все элементы. Мне данные приходят постоянно из сокета, пока соединение живое.
источник

AN

Alexander Nozik in Kotlin Community
Alex F.
Я не могу собрать все элементы. Мне данные приходят постоянно из сокета, пока соединение живое.
Тогда сортировка в принципе не возможна полностью. Вот отсортировали вы все по возрастанию, а приходит следующий элемент, который больше всех предыдущих. Надо тогда какими-то пачками делать, логику менять
источник

AN

Alexander Nozik in Kotlin Community
Или делайте динамическую структуру типа TreeSet и пусть она сортирует на хожу, но тогда не надо после этого никаких Flow делать
источник