RxSwift_v1.0筆記——3 Subjects

RxSwift_v1.0筆記——3 Subjects

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

開始 63

與PublishSubjects工作 64

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

開始是空并且僅僅發(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

在新的訂閱對象訂閱的時(shí)候會發(fā)送最近發(fā)送的事件捍掺,如果沒有則發(fā)送一個(gè)默認(rèn)值撼短。

開始有一個(gè)初始值,并且重復(fù)發(fā)送它(如果沒有新元素)或發(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

在新的訂閱對象訂閱的時(shí)候會補(bǔ)發(fā)所有已經(jīng)發(fā)送過的數(shù)據(jù)隊(duì)列曲横, bufferSize 是緩沖區(qū)的大小,決定了補(bǔ)發(fā)隊(duì)列的最大值不瓶。如果 bufferSize 是1禾嫉,那么新的訂閱者出現(xiàn)的時(shí)候就會補(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)勢是:不會被顯式終結(jié)黍匾。即:不會收到 .Completed 和 .Error 這類的終結(jié)事件,它會主動在析構(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)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市填物,隨后出現(xiàn)的幾起案子纹腌,更是在濱河造成了極大的恐慌,老刑警劉巖滞磺,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壶笼,死亡現(xiàn)場離奇詭異,居然都是意外死亡雁刷,警方通過查閱死者的電腦和手機(jī)覆劈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沛励,“玉大人责语,你說我怎么就攤上這事∧颗桑” “怎么了坤候?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長企蹭。 經(jīng)常有香客問我白筹,道長智末,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任徒河,我火速辦了婚禮系馆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘顽照。我一直安慰自己由蘑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布代兵。 她就那樣靜靜地躺著尼酿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪植影。 梳的紋絲不亂的頭發(fā)上裳擎,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音思币,去河邊找鬼句惯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛支救,可吹牛的內(nèi)容都是我干的抢野。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼各墨,長吁一口氣:“原來是場噩夢啊……” “哼指孤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贬堵,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恃轩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后黎做,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叉跛,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年蒸殿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了筷厘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宏所,死狀恐怖酥艳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情爬骤,我是刑警寧澤充石,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站霞玄,受9級特大地震影響骤铃,放射性物質(zhì)發(fā)生泄漏拉岁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一惰爬、第九天 我趴在偏房一處隱蔽的房頂上張望喊暖。 院中可真熱鬧,春花似錦补鼻、人聲如沸哄啄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沪么,卻和暖如春硼婿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背禽车。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工寇漫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人殉摔。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓州胳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親逸月。 傳聞我的和親對象是個(gè)殘疾皇子栓撞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 最近在學(xué)習(xí)RxSwift相關(guān)的內(nèi)容,在這里記錄一些基本的知識點(diǎn)碗硬,以便今后查閱瓤湘。 Observable 在RxSwi...
    L_Zephyr閱讀 1,762評論 1 4
  • 最近比較忙,更新得有點(diǎn)慢恩尾,望諒解弛说。 什么是Subject? 上一章我介紹了Observable——一個(gè)功能就像一條...
    turtleeeee閱讀 1,872評論 2 14
  • 原創(chuàng) 2017-06-13 RxSwift 這個(gè)框架RP框架相信你應(yīng)該不陌生了翰意,在Objective-C中我們使用...
    一根聰閱讀 6,249評論 4 14
  • 寫在最前面 聲明:此篇博文非本人原創(chuàng)木人,是我在學(xué)習(xí)RxSwift框架時(shí)在網(wǎng)上找的,網(wǎng)上其他版本的閱讀效果我不想吐槽冀偶,...
    zZ愛吃菜閱讀 18,705評論 11 55
  • 我們熱愛生命的理由虎囚,是因?yàn)樗鼇砣ゴ掖遥崽鹂嗬蹦枘ィ闼鶕碛械膮s是誰也復(fù)制不了的美麗人生淘讥。 ——于宜春...
    袁益君閱讀 181評論 0 0