使用Transformations.map而不是observeForever



我正在进行第一次实习,在一个项目中将RX代码转换为LiveData。在某个时候,我不得不在一些存储库中用observeForever((+Globalscope(Dispatchers.Main(替换subscribe((函数,但显然使用observeForever((不是最好的方法,我的实习导师建议我改用Transformations.map((。

我不确定如何在以下代码中使用map((而不是observeForever(在存储库中(:

//I am using Globalscope with Dispathers.Main otherwise I get "cannot observeForever in a background Thread error
GlobalScope.launch(Dispatchers.Main){
someBooleanLiveData.observeForever { 
if (it) {
// DO SOMETHING
} else {
// DO SOMETHING ELSE
}
}
}

我从Transformations.map((函数中了解到,它用于映射给定LiveData对象的值,就像ReactiveX 的map操作符一样

我试过了,但似乎没有达到我想要的效果:

Transformations.map(someBooleanLiveData){
if (it) {
// DO SOMETHING
} else {
// DO SOMETHING ELSE
}
}

我的问题是,我应该如何使用Transformation.map((来避免observeForever?

做点什么:如果你需要一个示例,可以是一个livedataObject.postValue(it(

提前感谢您的回复。

Transformations.map用于转换观察到的每个元素。因此,它没有一个有条件的方法来阻止排放。举例:

Transformations.map(booleanLiveData) {
if (it) 1 else 0
}

返回LiveData<Int>

如果您想添加使实时数据只在某些时候发出的条件,则必须使用MediatorLiveData

class MyMediator : MediatorLiveData<SomeType>() {

//we can create this wrapper method for convenience    
fun addBooleanSource(booleanLiveData: LiveData<Boolean>) {
//this method is already exposed and you can wrap it or do it in the invoker
addSource(booleanLiveData) {
if (it) {
value = //do something
}
}
}

}

诀窍是MediatorLiveData可以将value作为字段访问,这样您就可以选择何时更新,何时不更新,也可以在过程中应用转换。

使用它的方式你需要:

private val _myMediator = MyMediator()
val myMediator: LiveData<YourType>
get() = _myMediator
GlobalScope.launch(Dispatchers.Main){
_myMediator.addBooleanSource(someBooleanLiveData)
}

然后观察myMediator

最新更新