Kotlin rxjava调用Api';s基于布尔值

Kotlin rxjava调用Api';s基于布尔值,kotlin,retrofit,rx-java,Kotlin,Retrofit,Rx Java,我对RX java相当陌生,我知道如何使用zip或平面地图,但我有一个问题,我觉得没有选择: 我有一个正在尝试重构的方法: updateDetails(emailAddress: String?, updateEmail: Boolean, nickName: String?, updateNickName: Boolean, avatarFile:

我对RX java相当陌生,我知道如何使用zip或平面地图,但我有一个问题,我觉得没有选择:

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

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

现在,根据方法中的每个布尔值,我决定是否更新电子邮件、昵称或化身。早期,这是通过使用if条件和单个API调用实现的。有没有一种方法可以使用提供的标志压缩或组合调用

您可以通过分块方式实现:

    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()
    }

可空性是什么意思
emailAddress==null
表示电子邮件未更新,或者(如果标志为
true
)已删除?换句话说,为什么您需要
update*
标志呢?可空性意味着电子邮件id已被删除,并且需要在服务器上更新删除内容。这种设计使得用户可以从单个页面更新任何或所有这些项目,该页面将布尔值与字段关联。我知道设计不是最优的,但我继承了这一点。API调用的方法是否返回一个可观察的?是的,每个API调用返回一个,我也可以控制修改此部分。但是我无法控制如何以及使用什么参数来调用所讨论的方法Hanks,Gustavo-有一件事还不清楚,那就是在哪里以及如何获取这些API调用的结果。我知道订阅将是一个地方,但我不确定如何订阅!?