RxJava - Как буферизовать все элементы из потока, когда другой поток ожидает первый элемент? - PullRequest
1 голос
/ 30 апреля 2019

Есть 2 потока. Поток # 1 загружает данные с сервера для автозаполнения ввода. Поток № 2 - это пользовательский ввод с этого автозаполнения. Пользователь может печатать во время загрузки данных. Данные загружаются один раз. Когда он загружен, данные ищутся по всем значениям, которые набрал пользователь. Требуется выполнить поиск всех введенных пользователем данных, даже если данные недоступны.

Я думаю, что с мрамором гораздо проще объяснить мою проблему. Здесь я использую ОбъединитьПоследний : enter image description here 1 загружены данные. A, B, C, D - пользовательский ввод. Чего я пытаюсь добиться, так это получить 1А до 1В.

Мне нужен такой поток:

User types: c - nothing happens 
User types: r - nothing happens 
Data is loaded: search is made for 'c' and for 'cr' 
User types: o - search is made for 'cro' 
User types: c - search is made for 'croc' and so on...

Как я могу добиться этого с помощьюlateLatest или другой функции?

1 Ответ

1 голос
/ 01 мая 2019

Нечто подобное может быть достигнуто с помощью ReplaySubject для ввода текста, который ожидает начала воспроизведения (и когда он воспроизводит все элементы для начала), пока не будут загружены исходные данные.

Например,:

    @JvmStatic
    fun main(string: Array<String>) {
        val input = ReplaySubject.create<String>()
        val api = PublishSubject.create<Int>()


        input.delaySubscription<Int>(api)
                .withLatestFrom(api, BiFunction<String, Int, Pair<String, Int>> { t1, t2 -> Pair(t1, t2) })
                .subscribe { println("Group : Letters : ${it.first}, Search with : ${it.second}") }

        input.onNext("A")
        input.onNext("AB")
        api.onNext(1)
        input.onNext("ABC")
        input.onNext("ABCD")
        input.onNext("ABCDE")
        api.onNext(2)
        input.onNext("ABCDEF")
        input.onNext("ABCDEFG")
        input.onNext("ABCDEFGH")
    }

Вывод:

Group : Letters : A, Search with : 1
Group : Letters : AB, Search with : 1
Group : Letters : ABC, Search with : 1
Group : Letters : ABCD, Search with : 1
Group : Letters : ABCDE, Search with : 1
Group : Letters : ABCDEF, Search with : 2
Group : Letters : ABCDEFG, Search with : 2
Group : Letters : ABCDEFGH, Search with : 2
...