推荐使用哪种方法来组合多个LiveData:使用MediatorLiveData还是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方法看起来更简单。在许多情况下,这两种方法似乎具有相同的目的。

最佳答案

您应该直接使用MediatorLiveData
所有 Transformations. 实际上是MediatorLiveData s-switchMap只是一个中介程序,它根据提供的switchMapFunction的返回值动态交换源。
第二种方法只会产生无用的开销-您分配switchMap MediatorLiveData,只要map更改,它就会不断创建和交换新的MediatorLiveData liveData1对象。

10-01 04:03