214 похожих чатов

Малясь нубский вопрос. У меня есть апка, которая ходит в сеть.

Пишу логику сетевых запросов с использованием корутин.

В корутинах слабо шарю, написал в итоге какую - то дичь(пусть и работающую), и сейчас логика похода в сеть выглядит так(обобщённо):

Вью просит VM чего - нибудь загрузить -> VM открывает viewModelScope и дёргает у интерактора suspend функцию, которая возвращает результат -> suspend функция вызывает suspend функцию у репозитория -> репозиторий дёргает suspend функцию у ретрофита, и либо возвращает данные, либо кидает Exception.

Проблему я понял поздно: у меня в интеракторе 20 функций, из них 18 - suspend. Получилось месиво адовое. Если я захочу добавить в интерактор новую функцию, которая будет использовать результат другой функции из интерактора, то мне придётся для новой функции писать suspend модификатор, даже если это идеологически не нужно. Гг wp.

Думаю над тем как это всё по человечески переписать.

Пока придумал вот что: не открывать никаких скоупов в VM, а открывать скоуп в репозитории. Заводить там Job, писать в функции которая возвращает интерактору результат CoroutineScope(IO + Job).launch {}, делать в ней запрос и возвращать результат.

В теории, получится чище. Но очень смущает, что репозиторий ничего не знает о ЖЦ вьюхи.

Т.к, если мне нужно в VM, например, прибить сетевой запрос в ответ на действие пользователя, это просто довольно сделать(viewModelScope.cancel()). А если я буду запускать скоуп из репозитория, то я из UI его как бы не контроллирую вовсе, он там себе работает и всё.
Да и вообще, решил юзер покинуть экран, я из VM раз - и закрыл скоуп, а что будет со скоупом в репозитории мне вообще не ясно что - то. Это выглядит как потенциальный MemoryLeak вообще, т.к юзер покинул экран, а Job в репозитории всё ещё что - то делает.

Вопрос: я в нужном направлении двигаюсь? Норм идея, скоуп в репозитории заводить?

Прикладываю код одного из репозиториев, просто чтобы было. Сам проект фулл переписывается по кд, так что он в огне, ради сохранения психического здоровья не рекомендую смотреть его :D

https://github.com/KirstenLy/LibHelper3/blob/master/app/src/main/java/com/kirsten/libhelper/data/repository/WordRepositoryImpl.kt

2 ответов

11 просмотров

Изначальный подход был правильнее, не понимаю, что тебя не устроило

Ну, из своего опыта имеет смысл скоупа вне VM только если нужно там использовать async, например, но для этого есть coroutineScope {}, который также suspend добавляет. На счет VM, то там же есть расширения, 2 скоупа для VM и лайфсайкла. А то, что suspend много в одном место - просто сделать поменьше интерфейсов, ибо там скорее всего разная логика перемешана. А запускать launch внутри репозитория глупо, ибо приложение умрет, а лаунч будет жить, хотя это конечно иногда и специально нужно.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта