Size: a a a

Moxy – MVP библиотека под Android

2020 December 14

ЕК

Евгений Кузовкин... in Moxy – MVP библиотека под Android
Ребята, вопрос на засыпку. Допустим, есть цепочка вызовов, обёрнутых в разные CoroutineScope. Если опустить детали, то выглядит это вот так:
io {
   suspendFunInvocation()
   ui { viewState.someViewStateFunInvocation() }
}
Естественно, методы всегда намного больше и сложнее. Как бы обезопасили вызовы методов viewState, чтобы они всегда вызывались на определённом контексте (Dispatchers.Main)?
источник

P

Pavel in Moxy – MVP библиотека под Android
Можно сделать extension над viewState и вызывать его так:
viewStateEx { doSomething() }
источник

P

Pavel in Moxy – MVP библиотека под Android
А так, я уже давно предлагал разработчикам библиотеки добавить возможность задать свой runner для исполнения команд :)
источник

ЕК

Евгений Кузовкин... in Moxy – MVP библиотека под Android
Pavel
Можно сделать extension над viewState и вызывать его так:
viewStateEx { doSomething() }
источник

ЕК

Евгений Кузовкин... in Moxy – MVP библиотека под Android
у нас есть, но это это не даёт гарантий)
источник

ЕК

Евгений Кузовкин... in Moxy – MVP библиотека под Android
Тут нужно утонить, что ситуация может быть такая:

view {
   anyPrivateFun()
}
...
io {
   anyPrivateFun()
}
...
fun anyPrivate() {
   viewState.doSomething()
}

оборачивать любой вызов viewState в такой extension - не лучшая идея
источник

AD

Aleksey D. in Moxy – MVP библиотека под Android
Евгений Кузовкин
у нас есть, но это это не даёт гарантий)
оверрайднуть в BasePresenter getViewState и кидать там исключение 🙂
источник

ЕК

Евгений Кузовкин... in Moxy – MVP библиотека под Android
Aleksey D.
оверрайднуть в BasePresenter getViewState и кидать там исключение 🙂
вопрос, на что кидать исключение? проверять тред?
источник

AD

Aleksey D. in Moxy – MVP библиотека под Android
Евгений Кузовкин
вопрос, на что кидать исключение? проверять тред?
можно и на тред, можно всегда кидать и работать с ui { … }
нужно только убедиться, что библиотека нигде не зовет этот метод
источник

P

Pavel in Moxy – MVP библиотека под Android
Евгений Кузовкин
Тут нужно утонить, что ситуация может быть такая:

view {
   anyPrivateFun()
}
...
io {
   anyPrivateFun()
}
...
fun anyPrivate() {
   viewState.doSomething()
}

оборачивать любой вызов viewState в такой extension - не лучшая идея
По идее, вот так должно быть

fun anyPrivate() {
   viewState { doSomethingWithView() }
}
источник

AD

Aleksey D. in Moxy – MVP библиотека под Android
кстати, можно пойти еще дальще и сделать свой ViewState,  который будет на нужно потоке выполнять команды 🙂
наверное, это наименее костыльный вариант

в таком случае даже по рукам бить не надо, оно само работает
источник

ЕК

Евгений Кузовкин... in Moxy – MVP библиотека под Android
Pavel
По идее, вот так должно быть

fun anyPrivate() {
   viewState { doSomethingWithView() }
}
fun fun1() {
   viewState {
       anyPrivate()
       anyViewStateFun()
   }
}

fun anyPrivate() {
   viewState { doSomethingWithView() }
}

вот это напрягает
источник

ЕК

Евгений Кузовкин... in Moxy – MVP библиотека под Android
что будет в таком случае, выполнятся ли методы doSomethingWithView() и anyViewStateFun() в таком же порядке? надо проверить
источник

AD

Aleksey D. in Moxy – MVP библиотека под Android
Евгений Кузовкин
что будет в таком случае, выполнятся ли методы doSomethingWithView() и anyViewStateFun() в таком же порядке? надо проверить
вариант с ViewState не подходит разве?)
источник

АЕ

Алексей Ершов... in Moxy – MVP библиотека под Android
Интересная задачка, тоже подумаем.
источник

ЕК

Евгений Кузовкин... in Moxy – MVP библиотека под Android
Aleksey D.
вариант с ViewState не подходит разве?)
Надо проверить :)
источник

АЕ

Алексей Ершов... in Moxy – MVP библиотека под Android
Но вообще есть же правило: если ваша функция требует исполнения в определенном контексте, переключайте его внутри этой функции.
источник

АЕ

Алексей Ершов... in Moxy – MVP библиотека под Android
То есть писать приватную функцию и обращаться из нее к VS так себе идея.
источник

P

Pavel in Moxy – MVP библиотека под Android
viewState {
       anyPrivate()
       anyViewStateFun()
   }
По идее, так не надо бы делать.
В один viewState { } - один вызов метода View. Можно стат. анализ на это натравить, как вариант.
Но, да, тут лучше подумать разработчикам :)
источник

АЕ

Алексей Ершов... in Moxy – MVP библиотека под Android
Лайвдата для этого придумала post, самое честное будет сделать корутинный вьюстейт, чтобы вы ну никак не могли косякнуть с потоком
источник