只有Kotlin协程的数据流?

时间:2019-02-13 08:27:50

标签: kotlin rx-java2 kotlinx.coroutines

随着RxJava的出现,Ive习惯于返回我的存储库,返回可观察到的数据,这些数据会在发生基础更改时自动更新。我只需在存储库中有一个主题就可以收到有关更改信息的通知,而像getAll()这样的可观察对象就可以做到这一点。

以一个示例为例,使用以下伪代码:

fun getAll(): Observable<List<Model> {
    subject
        .filter { isChangeRelevant(it) }
        .startWith(initialChangeEvent)
        .map { queryAll() }
}

我很好奇仅使用协程如何以及是否可以实现同一目的?

1 个答案:

答案 0 :(得分:0)

您可以使用Channel的Kotlin协程。

如果只希望像流一样发出值(因此可以for-each),则可以使用produce创建它们(返回ReceiveChannel):

fun test(): ReceiveChannel<Int>{
        return produce {
            send(1)
            send(5)
            send(100)
        }
    }

您可以对consumeEach的值使用for-each(或test())来接收其值。

如果您希望您的频道与RxJava的PublishSubject完全一样,则可以使用ConflatedBroadCastChannel并向其发出值:

val broadCastChannel = ConflatedBroadcastChannel<Int>()

您可以使用broadCastChannel.offer(value)将值发送到通道。

要从通道接收值,可以使用简单的for-each循环:

for (i in broadCastChannel.openSubscription()) {
       //your values
}