RxJava-当另一个流等待第一个项目时,如何缓冲流中的所有项目?

时间:2019-04-30 17:23:29

标签: android rx-java reactive-programming rx-java2

有2个流。流#1从服务器加载数据以进行自动完成输入。流#2是来自该自动完成输入的用户输入。用户可以在加载数据时键入。数据加载一次。加载后,将按用户键入的所有值搜索数据。即使没有数据,也必须搜索用户输入的所有输入。

我认为使用大理石可以更容易地解释我的问题。在这里,我正在使用 combineLatest enter image description here 1已加载数据。 A,B,C,D是用户输入。我想要达到的目标是在1B之前获得1A。

我需要这样的流程:

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...

如何通过CombineLatest或其他功能实现此目标?

1 个答案:

答案 0 :(得分:1)

可以使用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