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 )上关注我,如果您有任何问题或想法,请不要在下面发表评论。