Subject 學(xué)習(xí)

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

BehaviorRelay

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容