我正在做我的第一个实习工作,我在一个项目中将RX代码转换为LiveData。在某些情况下,我不得不在一些存储库中将subscribe()函数替换为observeForever() + Globalscope(Dispatchers.Main),但显然使用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 operator一样
我试过了,但似乎没有做到我想要的:
Transformations.map(someBooleanLiveData){
if (it) {
// DO SOMETHING
} else {
// DO SOMETHING ELSE
}
}我的问题是,我应该如何使用Transformation.map()来避免observeForever?
做某事:如果你需要一个例子,可以是一个livedataObject.postValue(it)
提前感谢您的回复。
发布于 2021-05-11 22:42:24
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
https://stackoverflow.com/questions/67488434
复制相似问题