有2个流。流#1从服务器加载数据以进行自动完成输入。流#2是来自该自动完成输入的用户输入。用户可以在加载数据时键入。数据加载一次。加载后,将按用户键入的所有值搜索数据。即使没有数据,也必须搜索用户输入的所有输入。
我认为使用大理石可以更容易地解释我的问题。在这里,我正在使用 combineLatest : 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或其他功能实现此目标?
答案 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