【问题标题】:Subscribe to Observable only after another Observable has received element只有在另一个 Observable 接收到元素后才订阅 Observable
【发布时间】:2020-10-02 19:11:19
【问题描述】:

我正在尝试在一个地方声明我的所有订阅,并且没有任何中间中继或触发器。这就是我想要实现的目标。

我有一个Signal<X>,它只会在其他所有内容都加载完毕并且工作正常后才会开始接收值。但是现在我需要介绍另一个Observable<Y>,当我订阅它时,它会立即开始发出值,因为它正在从数据库中获取数据。这有点问题,因为我的 UI 还没有准备好显示结果,并且只有在 Signal<X> 发出它的第一个值时才准备好。在此之后,我想收到Observable<Y> 将收到的每一个值。

我正在尝试使用skipUntil,这很好,但我丢失了Observable<Y> 的第一个元素。 switchLatest 也不是很好的匹配。我也在研究amb,但这也不会给我正确的结果,因为它订阅了两个序列,这不是我需要的。

我的问题是:只有在原始 Observable 收到一个值之后,是否有可能订阅其他 Observable?并保持此订阅有效,以便它对新值做出反应。

【问题讨论】:

  • skipUntil 完全符合您的需要,您从 Observable 中丢失第一个元素是什么意思?
  • 你在这里没有提供很多细节。 “在加载完其他所有内容之后”是什么意思?这是否意味着在调用 viewDidLoad 时 X 会发出? X 到底是什么,你需要它来创建 Y 吗? X 是否多次发射?您说Observable<Y> 从数据库中获取值,但随后暗示它发出多次。这是本地数据库还是网络请求?

标签: ios swift rx-swift


【解决方案1】:

听起来您只需要一个简单的 flatMap 或其衍生工具之一。很大程度上取决于 X 和 Y 发射的频率以及当 X 在第一次发射后您想要做什么。

您可以通过阅读this article 了解更多信息,但下面的大理石图是一个不错的总结(它们假定默认的“冷”或惰性可观察。如果y 很热,那么情况就不同了。):

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--|

这完全取决于您到底想要什么行为。

【讨论】:

  • 你是对的。当我在寻找一些复杂的解决方案时,dlatMapFirst 正是我一直在寻找的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
相关资源
最近更新 更多