2

更推荐哪种方法来组合多个 LiveData(s):使用MediatorLiveDataor switchMap

// MediatorLiveData approach
fun <A, B, C> combine(
    liveData1: LiveData<A>,
    liveData2: LiveData<B>,
    onChanged: (A?, B?) -> C
): MediatorLiveData<C> {
    return MediatorLiveData<C>().apply {
        addSource(liveData1) {
            value = onChanged(liveData1.value, liveData2.value)
        }
        addSource(liveData2) {
            value = onChanged(liveData1.value, liveData2.value)
        }
    }
}

// switchMap approach
fun <A, B, C> combine(
    liveData1: LiveData<A>,
    liveData2: LiveData<B>,
    onChanged: (A, B) -> C
): LiveData<C> {
    return liveData1.switchMap { a ->
        liveData2.map { b ->
            onChanged(a, b)
        }
    }
}

MediatorLiveData方法可能更常见,但该switchMap方法看起来更简单。在许多情况下,这两种方法似乎都具有相同的目的。

4

1 回答 1

4

你应该直接使用MediatorLiveData

所有Transformations.实际上都是MediatorLiveDatas -switchMap只是一个根据提供的返回值动态交换源的中介switchMapFunction

第二种方法只会产生无用的开销 - 您分配的内容会在更改时switchMap MediatorLiveData不断创建和交换新map MediatorLiveData对象。liveData1

于 2020-07-16T13:07:45.980 回答