RxSwift_v1.0筆記——3 Subjects

RxSwift_v1.0筆記——3 Subjects

Subject——可以看做是一種代理和橋梁。它既是訂閱者又是訂閱源,這意味著它既可以訂閱其他 Observable 對(duì)象,同時(shí)又可以對(duì)它的訂閱者們發(fā)送事件。

開(kāi)始 63

與PublishSubjects工作 64

當(dāng)你訂閱PublishSubject的時(shí)候,你只能接收到訂閱他之后發(fā)生的事件

開(kāi)始是空并且僅僅發(fā)射新元素給訂閱中。

example(of: "PublishSubject") {
    let subject = PublishSubject<String>()
    subject.onNext("Is anyone listening?")
    
    let subscriptionOne = subject
        .subscribe(onNext: { string in
            print(string)
        })
    subject.on(.next("1"))
    subject.onNext("2")
    
    let subscriptionTwo = subject
        .subscribe { event in
            print("2)", event.element ?? event)
    }
    subject.onNext("3")
    subscriptionOne.dispose()
    subject.onNext("4")
    
    // 1
    subject.onCompleted()
    // 2
    subject.onNext("5")
    // 3
    subscriptionTwo.dispose()
    let disposeBag = DisposeBag()
    // 4
    subject
        .subscribe {
            print("3)", $0.element ?? $0)
        }
        .addDisposableTo(disposeBag)
    subject.onNext("?")
}
--- Example of: PublishSubject ---
1
2
3
2) 3
2) 4
2) completed
3) completed

與BehaviorSubjects工作 67

在新的訂閱對(duì)象訂閱的時(shí)候會(huì)發(fā)送最近發(fā)送的事件,如果沒(méi)有則發(fā)送一個(gè)默認(rèn)值。

開(kāi)始有一個(gè)初始值,并且重復(fù)發(fā)送它(如果沒(méi)有新元素)或發(fā)射最新的元素給訂閱中。

// 1
enum MyError: Error {
    case anError
}
// 2
func print<T: CustomStringConvertible>(label: String, event: Event<T>) {
    print(label, event.element ?? event.error ?? event)
}
// 3
example(of: "BehaviorSubject") {
    // 4
    let subject = BehaviorSubject(value: "Initial value")
    let disposeBag = DisposeBag()
    subject
        .subscribe {
            print(label: "1)", event: $0)
        }
        .addDisposableTo(disposeBag)
    subject.onNext("X")
    // 1
    subject.onError(MyError.anError)
    // 2
    subject
        .subscribe {
            print(label: "2)", event: $0)
        }
        .addDisposableTo(disposeBag)
}
--- Example of: BehaviorSubject ---
1) Initial value
1) X
1) anError
2) anError

與ReplaySubject工作 69

在新的訂閱對(duì)象訂閱的時(shí)候會(huì)補(bǔ)發(fā)所有已經(jīng)發(fā)送過(guò)的數(shù)據(jù)隊(duì)列, bufferSize 是緩沖區(qū)的大小,決定了補(bǔ)發(fā)隊(duì)列的最大值。如果 bufferSize 是1,那么新的訂閱者出現(xiàn)的時(shí)候就會(huì)補(bǔ)發(fā)上一個(gè)事件,如果是2,則補(bǔ)兩個(gè),以此類推。

使用緩沖區(qū)大小初始化,將保持元素的緩沖區(qū)達(dá)到該大小,并將其重新發(fā)送它給新的訂閱著。

example(of: "ReplaySubject") {
    // 1
    let subject = ReplaySubject<String>.create(bufferSize: 2)
    let disposeBag = DisposeBag()
    // 2
    subject.onNext("1")
    subject.onNext("2")
    subject.onNext("3")
    // 3
    subject
        .subscribe {
            print(label: "1)", event: $0)
        }
        .addDisposableTo(disposeBag)
    subject
        .subscribe {
            print(label: "2)", event: $0)
        }
        .addDisposableTo(disposeBag)
    subject.onNext("4")
    subject.onError(MyError.anError)
    subject.dispose()
    subject
        .subscribe {
            print(label: "3)", event: $0)
        }
        .addDisposableTo(disposeBag)
}
--- Example of: ReplaySubject ---
1) 2
1) 3
2) 2
2) 3
1) 4
2) 4
1) anError
2) anError
3) Object `RxSwift.(ReplayMany in _33052C2CE59F358A8740AFDD4371DD39)<Swift.String>` was already disposed.

與Variable工作 72

是基于 BehaviorSubject 的一層封裝,它的優(yōu)勢(shì)是:不會(huì)被顯式終結(jié)。即:不會(huì)收到 .Completed 和 .Error 這類的終結(jié)事件,它會(huì)主動(dòng)在析構(gòu)的時(shí)候發(fā)送 .Complete 。需要調(diào)用它自帶的asObservable()方法進(jìn)行轉(zhuǎn)化后才能被訂閱。

example(of: "Variable") {
    // 1
    var variable = Variable("Initial value")
    let disposeBag = DisposeBag()
    // 2
    variable.value = "New initial value"
    // 3
    variable.asObservable()
        .subscribe {
            print(label: "1)", event: $0)
        }
//        .addDisposableTo(disposeBag)
    // 1
    variable.value = "1"
    // 2
    variable.asObservable()
        .subscribe {
            print(label: "2)", event: $0)
        }
        .addDisposableTo(disposeBag)
    // 3
    variable.value = "2"
}
--- Example of: Variable ---
1) New initial value
1) 1
2) 1
1) 2
2) 2
1) completed
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 最近在學(xué)習(xí)RxSwift相關(guān)的內(nèi)容,在這里記錄一些基本的知識(shí)點(diǎn),以便今后查閱。 Observable 在RxSwi...
    L_Zephyr閱讀 1,891評(píng)論 1 4
  • 最近比較忙,更新得有點(diǎn)慢,望諒解。 什么是Subject? 上一章我介紹了Observable——一個(gè)功能就像一條...
    turtleeeee閱讀 1,974評(píng)論 2 14
  • 原創(chuàng) 2017-06-13 RxSwift 這個(gè)框架RP框架相信你應(yīng)該不陌生了,在Objective-C中我們使用...
    一根聰閱讀 6,392評(píng)論 4 14
  • 寫(xiě)在最前面 聲明:此篇博文非本人原創(chuàng),是我在學(xué)習(xí)RxSwift框架時(shí)在網(wǎng)上找的,網(wǎng)上其他版本的閱讀效果我不想吐槽,...
    zZ愛(ài)吃菜閱讀 18,837評(píng)論 11 55
  • 我們熱愛(ài)生命的理由,是因?yàn)樗鼇?lái)去匆匆,它酸甜苦辣,你所擁有的卻是誰(shuí)也復(fù)制不了的美麗人生。 ——于宜春...
    袁益君閱讀 212評(píng)論 0 0

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