Допустим, у меня есть функция
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 еще один шаг абстракции ...