Subjects 基本介紹
Subjects自身即是訂閱者,也是Observable
.因?yàn)樽陨砟軌騽討B(tài)接收新的值,因此說是訂閱者
.自身有了新值之后,它能通過Event發(fā)送給訂閱者,因此是Observable
總共4種PublishSubject BehaviorSubject ReplaySubject BehaviorRelay
PublishSubject
只會把訂閱者訂閱之后的消息發(fā)送給對應(yīng)的訂閱者,因此每個訂閱者只能接收到自己訂閱點(diǎn)開始之后的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")此時有兩個訂閱者,分別發(fā)送給兩個訂閱者
.
subject.onCompleted此時宣告Subjects結(jié)束,發(fā)送完complete事件給所有的接收者自身結(jié)束,不再發(fā)送任何事件
BehaviorSubject
.需要使用默認(rèn)值進(jìn)行初始化作為最新的Event,當(dāng)有訂閱者時會把最新的那個Event發(fā)送給訂閱者
.每次發(fā)送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
. 發(fā)送事件“1111”,之后Subjects持有最新的 1111,訂閱時發(fā)送給訂閱者
.
subject.onNext("22222") Subjects刷新,同時發(fā)送給訂閱者. 第二個訂閱者到來,單獨(dú)把最新的事件發(fā)送給訂閱者
.
subject.onNext("3333")把Event發(fā)送給當(dāng)前所有的訂閱者.
subject.onCompleted()通知所有接收者事件廣播結(jié)束,不再發(fā)送后續(xù)所有事件,釋放訂閱者
ReplaySubject
此Subject比較特殊,是PublishSubject和BehaviorSubject的結(jié)合體,結(jié)合二者特性
. 使用buffer作為緩沖區(qū)…將最新的放入buffer中,不足時淘汰最舊的數(shù)據(jù)
.訂閱時將buffer中的數(shù)據(jù)立即發(fā)送給訂閱者
.新的.next會被發(fā)送給當(dāng)前所有的訂閱者
.訂閱者訂閱一個結(jié)束的ReplaySubject會受到buffer中的.next,同時會受到結(jié)束的.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
.初始時發(fā)送3個.next,此時bufferSize =2因此緩存2 3
. 第一個訂閱時將buffer中存儲的Event發(fā)送給訂閱者打印 2 3
.發(fā)送 .next 4,刷新buffer為 3 4,同時把 4 發(fā)送給訂閱者打印 4
. 第二個訂閱者到來,將buffer中 3 4 發(fā)送給訂閱者 打印 3 4
. 發(fā)送replaySubject.onCompleted()事件給當(dāng)前所有訂閱者
. 第三個訂閱者到來Subjects已經(jīng)結(jié)束,因此發(fā)送buffer和.complete