Rx Java Вызов API на основе логических значений - PullRequest
1 голос
/ 16 апреля 2019

Я довольно новичок в RX Java, я знаю, как использовать zip или плоскую карту, однако у меня возникает следующая проблема, из-за которой у меня нет выбора:

У меня есть метод, который я пытаюсь реорганизовать:

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

Теперь на основе каждого логического значения внутри метода я определяю, обновлять ли электронную почту, псевдоним или аватар. Ранее это было достигнуто с помощью условий if и отдельных вызовов API. Есть ли способ, которым я могу сжать или объединить вызовы, используя поставленные флаги?

1 Ответ

1 голос
/ 16 апреля 2019

Вы можете добиться этого блокирующим способом:

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