Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin\Android-LiveData异步转换阻止以前的结果_Kotlin_Android Livedata_Mutablelivedata_Mediatorlivedata - Fatal编程技术网

Kotlin\Android-LiveData异步转换阻止以前的结果

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

因此,我有一个LiveData,我将其转换为一个异步函数,该函数需要一段时间才能执行(有时需要2秒,有时需要4秒)

有时呼叫需要很长时间,有时非常快(取决于结果),有时是即时的(空结果)

问题是,如果我的LiveData中有两个连续发射,有时第一个结果需要一段时间才能执行,第二个结果需要一个瞬间,然后在第一个结果之前显示第二个结果,然后用之前的计算覆盖结果

我想要的是连续效应的mroe。(有点像RxJava concatMap)

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))
        }
    }
}