Используйте объединение с последним массивом наблюдаемых - PullRequest
1 голос
/ 14 июня 2019

У меня есть 4 поля ввода текста. Когда пользователь вводит текст в любое из полей, я включаю кнопку. Чтобы достичь этого, я буду использовать зернокомбайн, используя 4 наблюдаемых, которые получают текст в своих потоках. Я в недоумении относительно того, как получить доступ к последним значениям каждого из наблюдаемых. ПРИМЕЧАНИЕ: я хочу использовать массив, так как в итоге будет более 4 полей ввода. Я также ищу решение в Котлине.

val text1: PublishSubject<String> = PublishSubject.create()
val text2: PublishSubject<String> = PublishSubject.create()
val text3: PublishSubject<String> = PublishSubject.create()
val text4: PublishSubject<String> = PublishSubject.create()

val inputs = Arrays.asList(
    text1, text2, text3, text4
)

Observable.combineLatest(inputs) {
  // How do I access the latest value from each observable?
}

Ответы [ 2 ]

2 голосов
/ 14 июня 2019

Внутри лямбды вы получаете массив.I-й элемент этого массива (arrayOfEmissions в следующем примере) соответствует последнему элементу, испущенному i-й наблюдаемой.

Observable.combineLatest(inputs) { arrayOfEmissions ->
}
0 голосов
/ 14 июня 2019

Вы можете объединить их и предоставить функцию для переноса значений в пользовательский класс:

    Observable.combineLatest(
            text1,
            text2,
            text3,
            text4,
            Function4<String, String, String, String, LatestResult> { t1, t2, t3, t4 ->
                LatestResult(t1, t2, t3, t4)
            })
            .subscribe { latestResult ->
                // Access the latest results here:
                println(latestResult.text1)
                println(latestResult.text2)
                println(latestResult.text3)
                println(latestResult.text4)
            }
}

data class LatestResult(val text1: String, val text2: String, val text3: String, val text4: String)
...