Как использовать переменную Object Observable внутри другой Observable функции подписки - RxJava - PullRequest
0 голосов
/ 28 мая 2019

У меня есть две наблюдаемые разных типа, которые испускают два разных типа объектов.Но мне нужно обновить аналитику при успешном входе в систему с userId и ролью.Идентификатор пользователя уже установлен в вызове функции входа в ViewModel при успешном входе в систему.

                       viewModel.login(emailId)
                                .observeOn(AndroidSchedulers.mainThread())
                                .autoDisposable(scopeProvider)
                                .subscribe({ (role, images) ->
                                analyticsProvider.updateUser(mapOf(Constants.Role to role, 
Constants.userId to *NEED TO ENTER USER ID FROM OTHER OBSERVABLE HERE*)))

My Session Observable, которое испускает объект User.

 class SessionClass{
        private val user = BehaviorSubject.create<User>()
        override fun setUser(user: User) {
                this.user.onNext(user)
            }
         override fun getUser(): Observable<User> = user.hide()
    }

Я попытался позвонить SessionClass().getUser().blockingFirst().userId в этом месте, но телефон зависает на экране входа в систему.

Можно ли как-нибудь исправить эту проблему?

1 Ответ

0 голосов
/ 28 мая 2019

Ваше решение не работает просто потому, что вы немедленно создаете экземпляр SessionClass и никогда не вызываете setUser(), поэтому getUser().blockingFirst() заблокируется навсегда. Я предполагаю, что у вас есть экземпляр SessionClass, который на самом деле будет вызывать setUser() в какой-то момент.

Ключ к тому, чтобы иметь доступ к пользователю, заключается в объединении Наблюдаемых. Подходящим выбором в этой ситуации является оператор zipWith. Это позволит вам оперировать значениями из двух источников одновременно. Например, ваш код может выглядеть примерно так:

val session: SessionClass = TODO() // get an instance somewhere

viewModel.login(emailId)
    .observeOn(AndroidSchedulers.mainThread())
    .zipWith(session.getUser().firstOrError(), BiFunction { (role, images): Pair<Role, Images>, user: User -> Triple(role, images, user) })
    .autoDisposable(scopeProvider)
    .subscribe({ (role, images, user) ->
        analyticsProvider.updateUser(mapOf(Constants.Role to role, Constants.userId to user.userId))
    })))

...