想象有兩個上游熱流和一個下游流。我希望能夠從下游流中收集一次,并讓下游流從兩個上游流中的任何一個中收集。我希望能夠使用一些邏輯來控制下游流從兩個上游流中的哪一個流收集,并且我希望能夠任意來回切換,直到我停止收集下游流。
例如,我呼叫一次:
downstreamFlow.collect {
// This is the endpoint of the flow
}
現在想象一個名為switch(). 我會像這樣開始收集上游流 1:
downstreamFlow.switch(upstreamFlow1) // Now the downstreamFlow is emitting upstreamFlow1
我會像這樣切換到上游流 2:
downstreamFlow.switch(upstreamFlow2) // Now the downstreamFlow is emitting upstreamFlow2
頂部collect將從上游 1 收集,然后從上游 2 收集。我可以任意來回切換。可能有上游 3,...等。會是什么樣switch()子?
尋找那個或任何其他有效的想法。
uj5u.com熱心網友回復:
我對此的解釋是,您需要一種封裝這種切換行為的方法,以便下游流的收集器不需要了解切換行為或有關上游流的任何資訊。
以下是我對如何實作它的想法。你最終會得到一個有點熱的 Flow,因為它的所有下游收集器都會在switch()被呼叫時切換到一個新的上游。但是,如果您將它與冷上游一起使用(不是您要求的,但它不是我撰寫它的限制方式),從每個下游收集器觸發自己的上游收集的意義上來說,它有點冷。您當然可以更改 的簽名switch以禁止冷上游,或者您可以更改switcherFlow函式以回傳圍繞實作的熱包裝器。
interface SwitcherFlow<T> : Flow<T> {
fun switch(upstream: Flow<T>)
}
@OptIn(ExperimentalCoroutinesApi::class)
class SwitcherFlowImpl<T> private constructor(
private val flowOfSources: MutableStateFlow<Flow<T>>
) : Flow<T> by flowOfSources.flatMapLatest({ it }), SwitcherFlow<T> {
constructor(initialFlow: Flow<T>) : this(MutableStateFlow(initialFlow))
override fun switch(upstream: Flow<T>) {
flowOfSources.value = upstream
}
}
fun <T> switcherFlow(initialFlow: Flow<T> = emptyFlow()): SwitcherFlow<T> =
SwitcherFlowImpl(initialFlow)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/523747.html
