Как передать результат функции приостановки функции без приостановки? - PullRequest
1 голос
/ 29 марта 2020

Допустим, у меня есть функция

suspend fun doSomething(): Result {
    val result = doStuff().await() //this is the suspending part
    return result
}

Теперь я хочу построить обобщенную c функцию, которая может принимать функции, подобные приведенной выше, в качестве параметра. Его главная цель - превратить переданный результат в объект liveata:

fun getResultLiveData(resource: Result): LiveData<Result> = liveData(Dispatchers.IO) {
    emit(resource)
}

Однако, когда я пытаюсь вызвать функцию приостановки, чтобы получить ее результат в качестве параметра, вот так:

fun someLiveData = getResultLiveData(doSomething())

Я получаю (понятное) исключение перед компиляцией для части внутри скобок getResultLiveData:

Suspend function doSomething() should be called only from a coroutine or another suspend function

Это, очевидно, имеет смысл, но как мне аннотировать параметр для моего getResultLiveData в результате приостановки функции?

Теперь, если бы я сделал что-то вроде:

fun getResultLiveData(): LiveData<Result> = liveData(Dispatchers.IO) {
    emit(doSomething())
}

Это бы сработало, потому что оно вызывается в рамках приостановившейся части. функции (то есть LiveDataScope). Но я просто хочу сделать go еще один шаг абстракции ...

1 Ответ

0 голосов
/ 29 марта 2020

Как предлагает @CommonsWare, решение состоит в том, чтобы передать саму функцию приостановки, а не результат функции в качестве параметра. Это также работает, когда функция приостановки имеет параметры.

Функция getResultLiveData должна выглядеть следующим образом:

fun getResultLiveData(resourceFunction: suspend () -> Result): LiveData<Result> = liveData(Dispatchers.IO) {
  emit(resourceFunction())
}

И тогда вы можете легко вызвать функцию в лямбда-выражении:

getResultLiveData{doStuff(param1, param2)}

или просто

getResultLiveData{doStuff()}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...