Subjects 基本介绍
Subjects自身即是订阅者,也是Observable
.因为自身能够动态接收新的值,因此说是订阅者
.自身有了新值之后,它能通过Event发送给订阅者,因此是Observable
总共4种PublishSubject BehaviorSubject ReplaySubject BehaviorRelay
PublishSubject
只会把订阅者订阅之后的消息发送给对应的订阅者,因此每个订阅者只能接收到自己订阅点开始之后的Event
func subjectTest() {
subject.onNext("1111")
subject.subscribe { string in
print("第1次订阅:", string)
} onCompleted: {
print("第1次订阅:onCompleted")
}.disposed(by: disposeBang)
subject.onNext("22222")
subject.subscribe { string in
print("第二次订阅",string)
} onCompleted: {
print("第二次订阅 onCompleted")
}.disposed(by: disposeBang)
subject.onNext("3333")
subject.onCompleted()
subject.onNext("444")
}
publish subject
.
subject.onNext("22222")此时只有第一个订阅者
.
subject.onNext("3333")此时有两个订阅者,分别发送给两个订阅者
.
subject.onCompleted此时宣告Subjects结束,发送完complete事件给所有的接收者自身结束,不再发送任何事件
BehaviorSubject
.需要使用默认值进行初始化作为最新的Event,当有订阅者时会把最新的那个Event发送给订阅者
.每次发送Event之后会把最新的Event持有
let subject = BehaviorSubject(value: "000")
subject.onNext("1111")
subject.subscribe { string in
print("第1次订阅:", string)
} onCompleted: {
print("第1次订阅:onCompleted")
}.disposed(by: disposeBang)
subject.onNext("22222")
subject.subscribe { string in
print("第二次订阅",string)
} onCompleted: {
print("第二次订阅 onCompleted")
}.disposed(by: disposeBang)
subject.onNext("3333")
subject.onCompleted()
subject.onNext("444")
subject.onNext("555")
BehaviorSubject
. 发送事件“1111”,之后Subjects持有最新的 1111,订阅时发送给订阅者
.
subject.onNext("22222") Subjects刷新,同时发送给订阅者. 第二个订阅者到来,单独把最新的事件发送给订阅者
.
subject.onNext("3333")把Event发送给当前所有的订阅者.
subject.onCompleted()通知所有接收者事件广播结束,不再发送后续所有事件,释放订阅者
ReplaySubject
此Subject比较特殊,是PublishSubject和BehaviorSubject的结合体,结合二者特性
. 使用buffer作为缓冲区…将最新的放入buffer中,不足时淘汰最旧的数据
.订阅时将buffer中的数据立即发送给订阅者
.新的.next会被发送给当前所有的订阅者
.订阅者订阅一个结束的ReplaySubject会受到buffer中的.next,同时会受到结束的.complete或者error
let replaySubject = ReplaySubject<String>.create(bufferSize: 2)
replaySubject.onNext("1111")
replaySubject.onNext("2222")
replaySubject.onNext("33333")
replaySubject.subscribe { event in
print("第一次订阅",event)
}.disposed(by: disposeBang)
replaySubject.onNext("44444444")
replaySubject.subscribe { event in
print("第二次订阅",event)
}.disposed(by: disposeBang)
replaySubject.onCompleted()
replaySubject.subscribe { event in
print("第三次订阅")
}.disposed(by: disposeBang)
replaySubject.onNext("555555")
image.png
.初始时发送3个.next,此时bufferSize =2因此缓存2 3
. 第一个订阅时将buffer中存储的Event发送给订阅者打印 2 3
.发送 .next 4,刷新buffer为 3 4,同时把 4 发送给订阅者打印 4
. 第二个订阅者到来,将buffer中 3 4 发送给订阅者 打印 3 4
. 发送replaySubject.onCompleted()事件给当前所有订阅者
. 第三个订阅者到来Subjects已经结束,因此发送buffer和.complete











网友评论