0

所以我有一个 LiveData,我将它转换为一个需要一段时间才能执行的异步函数(有时需要 2 秒或 4 秒)。

有时调用需要很长时间,有时它真的很快(取决于结果)有时它是即时的(空结果)

问题是,如果我的 LiveData 中有 2 次连续发射,有时第一个结果需要一段时间才能执行,而第二个结果需要一点时间,然后它会在第一个之前显示第二个,然后用较早的计算,

我想要的是顺序效应。(有点像 RxJava concatMap)

 private val _state = query.mapAsync(viewModelScope) { searchString ->
        if (searchString.isEmpty()) {
            NoSearch
        } else {
            val results = repo.search(searchString)
            if (results.isNotEmpty()) {
                Results(results.map { mapToMainResult(it, searchString) })
            } else {
                NoResults
            }
        }
    }




@MainThread
fun <X, Y> LiveData<X>.mapAsync(
    scope: CoroutineScope,
    mapFunction: androidx.arch.core.util.Function<X, Y>
): LiveData<Y> {
    val result = MediatorLiveData<Y>()
    result.addSource(this) { x ->
        scope.launch(Dispatchers.IO) { result.postValue(mapFunction.apply(x)) }
    }
    return result
}

如何防止第二个结果覆盖第一个结果?

4

1 回答 1

1
@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))
        }
    }
}
于 2021-02-17T14:57:20.820 回答