【问题标题】:Rx Java Calling Api's based on boolean values基于布尔值的 Rx Java 调用 Api
【发布时间】:2019-09-06 07:01:03
【问题描述】:

我是 RX java 的新手,我知道如何使用 zip 或平面地图,但是我遇到了以下问题,我觉得没有选择:

我有一个我正在尝试重构的方法:

updateDetails(emailAddress: String?, updateEmail: Boolean,
                                     nickName: String?, updateNickName: Boolean,
                                     avatarFile: File?, updateAvatar: Boolean)

现在根据方法中的每个布尔值,我确定是否更新电子邮件、昵称或头像。 Earleir 这是使用 if 条件和单独的 API 调用来实现的。有没有办法可以使用提供的标志压缩或组合调用?

【问题讨论】:

  • 可空性是什么意思? emailAddress==null 表示电子邮件没有更新,或者(如果标志是true)它被删除了?换句话说,你为什么需要update* 标志?
  • 可空性意味着电子邮件 id 已被删除,并且需要在服务器上更新删除,设计使得用户可以从单个页面更新任何或所有这些项目,将布尔值与字段。我知道设计不是最优的,但我继承了这一点。
  • API 调用的方法是否返回了 observable?
  • 是的,每个 API 调用都返回一个 Single>,我也可以控制修改这部分。但我无法控制该方法的调用方式和参数

标签: kotlin retrofit rx-java


【解决方案1】:

您可以通过阻塞方式实现它:

    fun updateDetails(emailAddress: String?, updateEmail: Boolean,
                      nickName: String?, updateNickName: Boolean,
                      avatarFile: File?, updateAvatar: Boolean) {
        if (updateEmail) {
            updateEmail(emailAddress).blockingGet()
        } 

        if (updateNickName) {
            updateNickName(nickName).blockingGet()
        }

        // ...
    }

或者你可以像这样构建链并在最后订阅它:

fun updateDetails(emailAddress: String?, updateEmail: Boolean,
                                     nickName: String?, updateNickName: Boolean,
                                     avatarFile: File?, updateAvatar: Boolean) {

        var chain = Completable.complete()

        if (updateEmail) {
            chain = chain.andThen(updateEmail(emailAddress).ignoreElement())
        }

        if (updateNickName) {
            chain = chain.andThen(updateNickName(nickName).ignoreElement())
        }

        // ...

        chain
            .subscribeOn(..)
            .observeOn(..)
            .subscribe()
}

或链接可完成项:

    fun updateDetails(emailAddress: String?, updateEmail: Boolean,
                      nickName: String?, updateNickName: Boolean,
                      avatarFile: File?, updateAvatar: Boolean) {

        Completable.defer {
            if (updateEmail) {
                updateEmail(emailAddress)
                    .ignoreElement()
            } else {
                Completable.complete()
            }
        }
            .andThen(Completable.defer {
                if (updateNickName) {
                    updateNickName(nickName)
                        .ignoreElement()
                } else {
                    Completable.complete()
                }
            })
            // ...
            .subscribeOn(..)
            .observeOn(..)
            .subscribe()
    }

【讨论】:

  • 谢谢,Gustavo - 不清楚的一件事是我将在哪里以及如何获取这些 API 调用的结果。我知道订阅会是这个地方,但我不确定怎么做!?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 2019-08-13
  • 2021-11-07
  • 2012-11-11
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
相关资源
最近更新 更多