RxSwift —主题

在RxSwift中潜水时,您需要概述主题。 那么什么是主题?

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

RxSwift中有4种主题类型:

PublishSubject :开始为空,仅向订阅者发出新元素。

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

ReplaySubject :使用缓冲区大小初始化,并将维护一个达到该大小的元素缓冲区并重播给新订户。

变量 :包装BehaviorSubject,将其当前值保留为状态,并仅将最新/初始值重放给新订户。

本部分重点介绍PublishSubject

一张图片胜过千言万语

第一个订阅者在1之后订阅,因此没有收到该事件,它接收2和3。第二个订阅者在2之后订阅,因此它仅接收3。

练习一万字 (😀)

假设我们有一个String类型的PublishSubject

  让主题= PublishSubject () 

尝试发出事件:

  subject.onNext(“没有事件发出吗?”) 

什么都没打印出来?

是的,因为没有关于此主题的订阅。

让我们创建一个订阅:

  let subscriptionOne = subject .subscribe(onNext:{ 打印 字符串 (“ First Subscription:”,字符串) }) 

现在使用主题发射物品

  subject.onNext(“ 1”) subject.onNext(“ 2”) 

肯定地,输出打印出1和2。

现在,让我们创建另一个订阅:

  let subscriptionTwo = subject .subscribe({ print中的 (event) (“ Second Subscription:\(event)”)) }) 

并尝试发出事件:

  subject.onNext(“ 3”) 

这将在subjectOne和subscriptionTwo上通知该主题发出3,他们侦听然后执行打印操作。

  第一订阅:3 第二订阅:next(3) 

接下来,我们尝试配置subscriptionOne并发出4

  subscriptionOne.dispose() subject.onNext(“ 4”) 

因为subscriptionOne资源已被处置,所以只有subscriptionTwo可以执行打印操作。

  第二订阅:next(4) 

最后,尝试发出complete事件,并且由于我们不再使用subscribeTwo,因此应该对其进行处理。

  subject.onCompleted() subscriptionTwo.dispose() subject.onNext(“是否发射任何事件?”) 

完成事件将被打印出来:

  第二订阅:已完成 

这是完整的代码和输出:

^ _ ^就是这样!

如果您喜欢本文,请单击心脏图标,在github( https://github.com/khuong291 )上关注我,如果您有任何问题或想法,请不要在下面发表评论。