Использование запуска viewmodelScope с преобразованиями жизненного цикла - PullRequest
0 голосов
/ 24 сентября 2019

Я использую следующие версии в своем проекте -

implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0-alpha04"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0-alpha04"

Поэтому в моем классе View Model я делаю -

fun initView() =
        Transformations.map(domain.performOperation()) {
            when (it) {
                ...
            }
        }

Мой класс View Model расширяет класс Base View Modelи класс Base View Model выглядит следующим образом -

open class BaseViewModel(private val coroutineCtx: CoroutineContext = Dispatchers.Main) :
    ViewModel(),
    CoroutineScope {

    private val job = SupervisorJob()

    override val coroutineContext: CoroutineContext
        get() = coroutineCtx + job

    override fun onCleared() {
        super.onCleared()
        job.cancel()
    }
}

Кажется, это работает, но я хочу импровизировать мой код и избавиться от стандартного кода сопрограммы в классе Base View Model.Поэтому я хочу использовать viewModelScope.launch непосредственно в классе My View Model.Но как мне использовать это с Transformations.map?

1 Ответ

0 голосов
/ 24 сентября 2019

Итак, если я все понял правильно, возможно, решение, подобное этому, может помочь вам:

В вашей деятельности / фрагмент

lifecycleScope.launchWhenStarted {
        val apiResult = viewModel.initView()
        updateUI(apiResult)
        }

В вашей ViewModel

private val apiDeferred = CompletableDeferred<LiveData<APIResult>>()

suspend fun initView(): LiveData<APIResult> {
        viewModelScope.launch(Dispatchers.IO) {
            val apiResult = domain.performOperation()
            artsDeferred.complete(arts)
        }
        return apiDeferred.await()
    }

И вы также можете посмотреть это видео здесь: https://www.youtube.com/watch?v=BOHK_w09pVA&t=1230s (через 22 минуты)

Скажите, пожалуйста, работает ли это для вас или нет, я также могу предложить другие решения с новейшими технологическими сопрограммами, liveDataи так далее

...