интерфейс ретрофита нужно ли делать запросы как suspend функции? в этом же смысла нет? suspend делаешь функции репозитория которые юзают апи
ну еще не помечать. потом в репозитории функция помеченная саспенд будет дергать простую функцию в апи
если не делать suspend в retrofit, то в репозитории нужно будет вызов заворачивать в withContext(Dispatchers.io) (ну или какой вы там используете диспатчер для запросов)
не придется, функция репозитория сама по себе suspend, зачем мне поток в ней переключать
чтобы не заблокировать вызывающий её поток. Вызвать блокируемый метод ретрофита из suspend функции в данном случае - это примерно как Thread.sleep в неё добавить
почему вы думаете что в suspend repoFunGetData() { api.getData() } я имею право только другие suspend функции вызывать? это заблуждение. Все будет ок, вызывающая фукцию репозитория сопрограмма уже на io
можно другие функции вызывать, но они будут блокировать поток на время своего выполнения. А почему функция репозитория вызывается уже на io? А что, если нет?
имею ввиду что хоть функцию пометил suspned в апи хоть нет, от этого не зависит вызывают функцию репозитория на io или на main. За это всегда отвечает , например скоуп во вьюмодели, чтобы дальше лишних переключений не делать. Ну не поток же блокировать, а сопрограмму. Но я понял, что самая последняя функция касается ожидания ответа из сети и ее делать не suspned опасно, только если реактивное апи использовать
в корутинах есть достаточно четкое соглашение: suspend-функция не должна блокировать вызывающий её поток (main-safe). Механизм корутин более-менее сам умеет фазить переключения диспатчеров
да просто может быть вызвана саспенд функция, а в ней какой-то матем. расчет, используешь какие-то Math api и как тут не заблокировать. В моем конкретном примере я не подумал, что функция в интерфейсе апи будет блокироваться, с дуру решил, что раз в репозитории саспенд, то поток будет переключаться даже после того как добрался до не саспенд
Я перевожу поток ещё в домене, ибо там уже начинается выполнения тяжёлой бизнес логики, по возврату в презентацию в том же домене я возвращаю результат в главный поток
Для выполнения тяжёлых расчётов можно перейти на Default диспатчер внутри самой функции, там где это надо. Или просто вызвать yield периодически, тогда можно вообще не блокировать никакой поток. 😀
Обсуждают сегодня