RxSwift主题

将新值添加到可观察值? 向主题问好。

开发应用程序时,通常需要在运行时将新值手动添加到可观察对象上,并将其发送给订阅者。 我们想要的是既可以观察又可以充当观察者的东西。

这称为主题

主体既充当可观察者又充当观察者。 他们可以接收.next事件,并且每次接收到事件时,它都会转身并将其发送给其订户。

RxSwift中有四种主题类型

  • PublishSubject :开始为空,仅向订阅者发出新元素。
  • BehaviorSubject :从初始值开始,然后将其或最新元素重放给新订户。
  • ReplaySubject :使用缓冲区大小初始化,并将保留最大大小的元素的缓冲区并重播给新订户。
  • BehaviorRelay :包装BehaviorSubject,将其当前值保留为状态,并仅向新订阅者重播最新/初始值。

发布主题

让我们创建一个PublishSubject,在上面添加一些订阅者,并在运行时添加一些值。

请记住,PublishSubject会向订阅者发出新的元素,因此,为了使订阅者获取值,订阅之后必须发生.onNext事件。

输出:

 第一:下一个(1) 
第一:下一个(2)
第一:下一个(3)
第二:下一个(3)
第一:下一个(4)
第二:下一个(4)
第二:下一个(5)
第三名:下一个(5)

有道理吧? 订阅者等待.onNext事件以获取值。 订阅后,订阅者将从PublishSubject接收值,直到订阅被释放。

行为主体

使用与以前相同的代码,只是主题类型有所不同。

输出:

 第一:下一个(初始值) 
第一:下一个(1)
第一:下一个(2)
第二个:next(2)
第一:下一个(3)
第二:下一个(3)
第一:下一个(4)
secord:下一个(4)
第三名:下一个(4)
secord:下一个(5)
第三名:下一个(5)

如您所见,输出的主要区别在于,发生订阅时,订阅者会立即打印该值。 记得?

BehaviorSubject从初始值开始,然后将其或最新元素重放给新订阅者。

重播主题

输出:

 第一:下一个(1) 
第一:下一个(2)
第二个:next(1)
第二个:next(2)
第一:下一个(3)
第二:下一个(3)
第一:下一个(4)
第二:下一个(4)
第三名:下一个(1)
第三名:next(2)
第三名:下一个(3)
第三名:下一个(4)
第二:下一个(5)
第三名:下一个(5)

如您所见,当发生新订阅时,主题也会发出以前的值,而不是当前/新的值。 多少? 取决于bufferSize值。 在第三个订阅中,它的工作原理非常清楚。

行为继电器

输出:

 第一:下一个(初始值) 
第一:下一个(1)
第一:下一个(2)
第二个:next(2)
第一:下一个(3)
第二:下一个(3)
第一:下一个(4)
secord:下一个(4)
第三名:下一个(4)
secord:下一个(5)
第三名:下一个(5)

BehaviorRelay替换了RxSwift的Variable,因为它被标记为折旧。 BehaviorRelay主题是BehaviorSubject包装器,具有一个主要区别。 您使用.accept方法添加值,该方法位于RxCocoa上,因此需要新导入,并且不能以.error或.completed事件终止。