让我从示例代码片段开始
suspend fun executeLive(result: MutableLiveData<Person>) {
val response = ... //suspend api request
mediatorLiveData.removeSource(response)
mediatorLiveData.addSource(response) { it ->
result.value = sortData(it) // sortData is also suspend function which sortData at Dispatcher.Default
}
}
在此示例中,sortData
不能在lambda function
下调用(在本例中为addSource
)。而且我已经将executeLive
声明为suspend
,因此为什么suspend
api请求可以首先开始。但是sortData
函数显示编译时错误
只能从协程体调用挂起函数
因此,如何更改我的代码结构以解决此问题?希望你有个美好的一天。谢谢!
更新:是否有关于此的文章?让我知道。
lambda通常是一个回调函数。之所以称呼回调函数,是因为我们将代码块包装在一个函数中,然后将其传递给其他人(或其他地方)执行。这是控制的基本反转,其中的代码不是您要执行的代码,而是其他人可以执行的代码(例如框架)。
例如,当您在按钮上设置onClickListener
时,我们不知道何时调用它,我们为框架传递了一个lambda值,该值负责用户交互以调用指定的动作。
在您的情况下,类似地,suspend函数未调用sortdata
,而是将其传递给mediatorLiveData
对象以在其自身的上下文中对其进行调用。不必从协程体内调用您传递的lambda,因此不允许这样做。
希望此说明有所帮助。