首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Transformations.map而不是observeForever

使用Transformations.map而不是observeForever
EN

Stack Overflow用户
提问于 2021-05-11 22:06:54
回答 1查看 102关注 0票数 0

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

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

代码语言:javascript
复制
        //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一样

我试过了,但似乎没有做到我想要的:

代码语言:javascript
复制
        Transformations.map(someBooleanLiveData){
            if (it) {
                // DO SOMETHING
            } else {
                // DO SOMETHING ELSE
            }
        }

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

做某事:如果你需要一个例子,可以是一个livedataObject.postValue(it)

提前感谢您的回复。

EN

回答 1

Stack Overflow用户

发布于 2021-05-11 22:42:24

Transformations.map旨在用于转换观察到的每个元素。所以它没有一个有条件的方法来防止排放。举个例子:

代码语言:javascript
复制
Transformations.map(booleanLiveData) {
    if (it) 1 else 0
}

它返回一个LiveData<Int>

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

代码语言:javascript
复制
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作为字段进行访问,因此您可以选择何时更新它,以及何时不更新它,还可以在流程中应用转换。

以您需要的方式使用它:

代码语言:javascript
复制
        private val _myMediator = MyMediator()
        val myMediator: LiveData<YourType>
            get() = _myMediator

        GlobalScope.launch(Dispatchers.Main){
            _myMediator.addBooleanSource(someBooleanLiveData)
        }

然后观察myMediator

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67488434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档