RxSwift學習(Subject)

推薦書本:RxSwift
電子版地址:https://pan.baidu.com/s/1bp8MlC7 密碼 5tjx
本文是RxSwift書本 學習筆記
書本code地址:https://pan.baidu.com/s/1o7GVBrO

Subject 可以看做是一種代理和橋梁。它既是訂閱者又是訂閱源。
作為一個觀察者和觀察者。您早就看到了他們如何接收事件并訂閱。該主題接收到下一個事件,每次收到一個事件時,它都會將它發送給它的訂閱者。

當你訂閱PublishSubject的時候,你只能接收到訂閱他之后發生的事件。subject.onNext()發出onNext事件,對應的還有onError()和onCompleted()事件

func writeSequenceToConsole<O: ObservableType>(name: String, sequence: O) {
    sequence
        .subscribe { e in
            print("Subscription: \(name), event: \(e)")
    }
}

example(of: "PublishSubject") {
    let subject = PublishSubject<String>()
    

    writeSequenceToConsole(name: "1", sequence: subject)
    
    subject.onNext("Is anyone Listeing?")
    subject.on(.next("1"))
    subject.on(.next("2"))
    
    writeSequenceToConsole(name: "2", sequence: subject)
    subject.onNext("Is anyone Listeing?")
    subject.on(.next("1"))
    subject.on(.next("2"))
    
}
紅色為第一組,藍色為第二組發送, 黃色箭頭為 第二次發送發送的事件 被第一組接收

ReplaySubject 在新的訂閱對象訂閱的時候會補發所有已經發送過的數據隊列, bufferSize 是緩沖區的大小,決定了補發隊列的最大值。如果 bufferSize 是1,那么新的訂閱者出現的時候就會補發上一個事件,如果是2,則補兩個,以此類推。(距觀察,補發的事件是先進后出)

![Uploading image_072992.png . . .]

example(of: "ReplaySubject") {
    let subject = ReplaySubject<String>.create(bufferSize: 1)
    
    writeSequenceToConsole(name: "1", sequence: subject)
    
    subject.onNext("Is anyone Listeing? 1")
    subject.on(.next("a"))
    subject.on(.next("b"))
    
    writeSequenceToConsole(name: "2", sequence: subject)
    subject.onNext("Is anyone Listeing? 2")
    subject.on(.next("c"))
    subject.on(.next("d"))
}
紅藍黃和上面一樣, 紫色圈出來部分為

========================================

BehaviorSubject
BehaviorSubject 在新的訂閱對象訂閱的時候會發送最近發送的事件,如果沒有則發送一個默認值。

如圖所示。

================================
Variable
Variable 是基于 BehaviorSubject 的一層封裝,它的優勢是:不會被顯式終結。即:不會收到 .Completed 和 .Error 這類的終結事件,它會主動在析構的時候發送 .Complete 。

================================
Variable
Variable 是基于 BehaviorSubject 的一層封裝,它的優勢是:不會被顯式終結。即:不會收到 .Completed 和 .Error 這類的終結事件,它會主動在析構的時候發送 .Complete 。
需要通過asObservable()方法來訪問其behavior subject.主題

example(of: "Variable") { 
    let variable = Variable("z")
    let disposeBag = DisposeBag()
    variable.value = "new initial"
    variable.asObservable().subscribe{print("1)\($0)")}.addDisposableTo(disposeBag)
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容