Kotlin\Android-LiveData异步转换阻止以前的结果
因此,我有一个LiveData,我将其转换为一个异步函数,该函数需要一段时间才能执行(有时需要2秒,有时需要4秒) 有时呼叫需要很长时间,有时非常快(取决于结果),有时是即时的(空结果) 问题是,如果我的LiveData中有两个连续发射,有时第一个结果需要一段时间才能执行,第二个结果需要一个瞬间,然后在第一个结果之前显示第二个结果,然后用之前的计算覆盖结果 我想要的是连续效应的mroe。(有点像RxJava concatMap)Kotlin\Android-LiveData异步转换阻止以前的结果,kotlin,android-livedata,mutablelivedata,mediatorlivedata,Kotlin,Android Livedata,Mutablelivedata,Mediatorlivedata,因此,我有一个LiveData,我将其转换为一个异步函数,该函数需要一段时间才能执行(有时需要2秒,有时需要4秒) 有时呼叫需要很长时间,有时非常快(取决于结果),有时是即时的(空结果) 问题是,如果我的LiveData中有两个连续发射,有时第一个结果需要一段时间才能执行,第二个结果需要一个瞬间,然后在第一个结果之前显示第二个结果,然后用之前的计算覆盖结果 我想要的是连续效应的mroe。(有点像RxJava concatMap) private val\u state=query.mapsync
private val\u state=query.mapsync(viewModelScope){searchString->
if(searchString.isEmpty()){
鼻弓
}否则{
val results=repo.search(searchString)
if(results.isNotEmpty()){
结果(Results.map{mapToMainResult(it,searchString)})
}否则{
诺里斯
}
}
}
@主线
fun LiveData.mapsync(
经营范围:协同视野,
mapFunction:androidx.arch.core.util.Function
):LiveData{
val result=MediatorLiveData()
result.addSource(this){x->
scope.launch(Dispatchers.IO){result.postValue(mapFunction.apply(x))}
}
返回结果
}
如何防止第二个结果覆盖第一个结果?@MainThread
@MainThread
fun <X, Y> LiveData<X>.mapAsync(
scope: CoroutineScope,
mapFunction: (X) -> Y,
): LiveData<Y> = switchMap { value ->
liveData(scope.coroutineContext) {
withContext(Dispatchers.IO) {
emit(mapFunction(value))
}
}
}
fun LiveData.mapsync(
经营范围:协同视野,
映射函数:(X)->Y,
):LiveData=switchMap{value->
liveData(scope.coroutineContext){
withContext(Dispatchers.IO){
发射(映射函数(值))
}
}
}
@MainThread
fun <X, Y> LiveData<X>.mapAsync(
scope: CoroutineScope,
mapFunction: (X) -> Y,
): LiveData<Y> = switchMap { value ->
liveData(scope.coroutineContext) {
withContext(Dispatchers.IO) {
emit(mapFunction(value))
}
}
}