【发布时间】:2020-03-09 14:59:08
【问题描述】:
我有一种情况,我需要观察用户 ID,然后使用这些用户 ID 来观察用户。 userIds 或 users 可以随时更改,我希望让发出的用户保持最新。 这是我拥有的数据来源的示例:
data class User(val name: String)
fun observeBestUserIds(): Flow<List<String>> {
return flow {
emit(listOf("abc", "def"))
delay(500)
emit(listOf("123", "234"))
}
}
fun observeUserForId(userId: String): Flow<User> {
return flow {
emit(User("${userId}_name"))
delay(2000)
emit(User("${userId}_name_updated"))
}
}
在这种情况下,我希望排放量为:
[User(abc_name), User(def_name)],然后
[User(123_name), User(234_name)],然后
[User(123_name_updated), User(234_name_updated)]
我想我可以像这样在 RxJava 中实现这一点:
observeBestUserIds.concatMapSingle { ids ->
Observable.fromIterable(ids)
.concatMap { id ->
observeUserForId(id)
}
.toList()
}
我会编写什么函数来生成一个发出它的流?
【问题讨论】:
-
您想要列出的 3 个排放量的流,还是想要标题中的
toList?它们是完全不同的问题。 -
我只想要在任何给定时间最新的最新用户,所以列出的排放量很好。
-
您是否在排放 2 和 3 之间遗漏了
[User(abc_name_updated), User(def_name_updated)],或者不应该排放它们(如果是,为什么)? -
这也可能被发射,我不介意,但想象延迟反映了数据库的发射,我并不真正关心那个发射,因为 id 123 和 234 应该已经发射并且 abc和 def 已经过时了
标签: kotlin rx-java kotlin-coroutines kotlin-flow