Ios 仅在另一个可观察对象收到元素后订阅可观察对象
我试图在一个地方声明我的所有订阅,并且没有任何中间中继或触发器。以下是我想要实现的目标 我有一个Ios 仅在另一个可观察对象收到元素后订阅可观察对象,ios,swift,rx-swift,Ios,Swift,Rx Swift,我试图在一个地方声明我的所有订阅,并且没有任何中间中继或触发器。以下是我想要实现的目标 我有一个信号,只有在加载了所有其他内容并且这个东西工作正常后,它才会开始接收值。但现在我需要引入另一个可观察的,当我订阅时,它将立即开始发出值,因为它正在从数据库获取数据。这有点问题,因为我的UI还没有准备好显示结果,只有当信号发出第一个值时,它才会准备好。在此之后,我希望接收可观察到的将接收到的每一个值 我尝试使用skipUntil,这很好,但是我正在失去可观察的的第一个元素switchLatest也不是很
信号
,只有在加载了所有其他内容并且这个东西工作正常后,它才会开始接收值。但现在我需要引入另一个可观察的,当我订阅时,它将立即开始发出值,因为它正在从数据库获取数据。这有点问题,因为我的UI还没有准备好显示结果,只有当信号
发出第一个值时,它才会准备好。在此之后,我希望接收可观察到的将接收到的每一个值
我尝试使用skipUntil
,这很好,但是我正在失去可观察的的第一个元素switchLatest
也不是很好的匹配。我还研究了amb
,但这也不会给我正确的结果,因为它订阅了两个序列,而这不是我需要的
我的问题是:只有在原始可观察对象收到一个值后,才有可能订阅其他可观察对象吗?同时保持订阅活动,以便它对新值做出反应。听起来像是一个简单的平面图或其衍生产品就是您所需要的。这在很大程度上取决于X和Y的发射频率,以及X在第一次发射后要执行的操作
您可以通过阅读了解更多信息,但下面的大理石图是一个不错的总结(它们假设默认的“冷”或惰性可观察。如果y
是热的,则情况就不同了):
或
或
或
这完全取决于你到底想要什么样的行为。skipUntil做的正是你所需要的,你说你失去了第一个元素是什么意思?这里你没有给出太多细节。“其他所有内容加载后”是什么意思?这是否意味着调用viewDidLoad时X会发射?什么是X
,您需要它来创建Y
?X
是否多次发射?你说,Observable
从数据库中获取值,但暗示它多次发射。这是本地数据库还是脱离网络请求?你是对的。当我在寻找某种复杂的解决方案时,dlatMapFirst
正是我一直在寻找的。非常感谢。
x.flatMap { _ in y }
x +---1---2---3---|
y +--A--B--C--|
y +--D--E--F--|
y +--G--H--J--|
--
+------A--BD-CEG-FH--J--|
x.flatMapFirst { _ in y }
x +---1---2---3---|
y +--A--B--C--|
--
+------A--B--C--|
x.flatMapLatest { _ in y }
x +---1---2---3---|
y +--A
y +--D
y +--G--H--J--|
--
+------A---D---G--H--J--|
x.concatMap { _ in y }
x +---1---2---3---|
y +--A--B--C--|
y +--D--E--F--|
y +--G--H--J--|
--
+------A--B--C-----D--E--F-----G--H--J--|