RxJava - 如何在另一个流等待第一个项目时缓冲流中的所有项目?
RxJava - How to buffer all items from stream when another stream waits for first item?
有 2 个流。 Stream #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 或其他函数实现此目的?
可以使用 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
有 2 个流。 Stream #1 从服务器加载数据以进行自动完成输入。流 #2 是来自该自动完成输入的用户输入。用户可以在数据加载时键入。数据加载一次。加载时,将按用户键入的所有值搜索数据。即使数据不可用,也需要搜索用户输入的所有内容。
我认为用大理石更容易解释我的问题。这里我使用 combineLatest:
我需要这样的流量:
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 或其他函数实现此目的?
可以使用 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