基于布尔值的Rx Java调用Api

时间:2019-04-16 08:26:54

标签: kotlin retrofit rx-java

对于RX Java来说我还很陌生,我知道如何使用zip或平面地图,但是我有以下问题,我感到无法选择:

我有一个要重构的方法:

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

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

1 个答案:

答案 0 :(得分: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()
    }