RxSwift文檔翻譯2--Working with Subjects

0 前言

第二節(jié)開頭的時候穩(wěn)定頂一個協(xié)議擴(kuò)展和一個方法庭砍,便于本章中方法的測試

  • 協(xié)議擴(kuò)展是給每個觀察者加一個id的標(biāo)示符并且打印事件相關(guān)的信息

  • 方法的大致作用是將觀察序列作為參數(shù)傳入舔示,然后訂閱此序列

extension ObservableType {
    
    /**
     Add observer with `id` and print each emitted event.
     - parameter id: an identifier for the subscription.
     */
    func addObserver(_ id: String) -> Disposable {
        return subscribe { print("Subscription:", id, "Event:", $0) }
    }
    
}

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

接下來進(jìn)行本章的翻譯

Working with Subjects

  • subject介紹

subject 在Rx的某些實現(xiàn)中充當(dāng)?shù)氖菢蛄夯虼砟⒅荆瘸洚?dāng)觀察者又充當(dāng)被觀察者。 因為它是一個觀察者假哎,它可以訂閱一個或多個觀察器擎浴,又因為是被觀察者虱疏,所以它可以通過重新發(fā)出它們觀察到的項目,并且它也可以發(fā)射新的項目魂拦。

  • PublishSubject
    向所有的觀察者發(fā)送新事件毛仪,這些事件是觀察者訂閱之后的事件,訂閱之前的事件芯勘,觀察者無法接收到
example("PublishSubject") {
    let disposeBag = DisposeBag()
    let subject = PublishSubject<String>()
    
    subject.addObserver("1").disposed(by: disposeBag)
    subject.onNext("??")
    subject.onNext("??")
    
    subject.addObserver("2").disposed(by: disposeBag)
    subject.onNext("???")
    subject.onNext("???")
}

// 控制臺打印的結(jié)果:
--- PublishSubject example ---
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)

其中onNext(:) 方法等同于on(.next(:)方法, 作用是為向訂閱者發(fā)送Next 事件

  • ReplaySubject
    在新的訂閱者訂閱的時候會補發(fā)事件箱靴,bufferSize決定補發(fā)事件的數(shù)量,如果bufferSize為1則補發(fā)一個事件荷愕,為2則補發(fā)兩個
    觀察一下bufferSize為1和2不同的值的時候控制臺打印的不同情況
example("ReplaySubject") {
            let disposeBag = DisposeBag()
            let subject = ReplaySubject<String>.create(bufferSize: 1)
            
            subject.addObserver("1").disposed(by: disposeBag)
            subject.onNext("??")
            subject.onNext("??")
            
            subject.addObserver("2").disposed(by: disposeBag)
            subject.onNext("???")
            subject.onNext("???")
        }
// bufferSize = 1
// 控制臺打印的結(jié)果:
--- ReplaySubject example ---
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 2 Event: next(??)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)

// bufferSize = 2
// 控制臺打印的結(jié)果:
--- ReplaySubject example ---
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 2 Event: next(??)
Subscription: 2 Event: next(??)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
  • BehaviorSubject
    向新的訂閱者補發(fā)送新的事件衡怀,如果沒有新事件就補發(fā)默認(rèn)值,默認(rèn)值應(yīng)該是在BehaviorSubject初始化時候創(chuàng)建的
example("BehaviorSubject") {
    let disposeBag = DisposeBag()
    let subject = BehaviorSubject(value: "??")
    
    subject.addObserver("1").disposed(by: disposeBag)
    subject.onNext("??")
    subject.onNext("??")
    
    subject.addObserver("2").disposed(by: disposeBag)
    subject.onNext("???")
    subject.onNext("???")
    
    subject.addObserver("3").disposed(by: disposeBag)
    subject.onNext("??")
    subject.onNext("??")
}
// 控制臺打印的結(jié)果:
--- BehaviorSubject example ---
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 2 Event: next(??)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
Subscription: 3 Event: next(???)
Subscription: 1 Event: next(??)
Subscription: 2 Event: next(??)
Subscription: 3 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 2 Event: next(??)
Subscription: 3 Event: next(??)

PublishSubject, ReplaySubject, and BehaviorSubject這三種的subject在 disposed of. 的時候不需要自動發(fā)出Complete 事件安疗,

  • Variable
    Variable是對BehaviorSubject的封裝抛杨,所以它具向訂閱者發(fā)送最近的值的功能。它還有保存當(dāng)前的值得的功能荐类,它不會發(fā)出Error事件怖现,但是它會自動發(fā)送Complete事件,并在deinit的時候終止
example("Variable") {
    let disposeBag = DisposeBag()
    let variable = Variable("??")
    
    variable.asObservable().addObserver("1").disposed(by: disposeBag)
    variable.value = "??"
    variable.value = "??"
    
    variable.asObservable().addObserver("2").disposed(by: disposeBag)
    variable.value = "???"
    variable.value = "???"
}
// 控制臺打印的結(jié)果:
--- Variable example ---
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 2 Event: next(??)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
Subscription: 1 Event: completed
Subscription: 2 Event: completed

** Variable 對象調(diào)用asObservable() 方法是為了訪問其底層的BehaviorSubject序列玉罐。 變量沒有使用on運算符(例如onNext(_ :))屈嗤,而是暴露可用于獲取當(dāng)前值的value屬性,并設(shè)置一個新值吊输。 設(shè)置一個新值也會將該值添加到其底層的BehaviorSubject序列中饶号。**

此處對VariableBehaviorSubject 做一下對比 :

        example("Variable") {
            let disposeBag = DisposeBag()
            let variable =  Variable("??")
            
            variable.asObservable().addObserver("1").disposed(by: disposeBag)
            variable.value = "??"
            variable.value = "??"
            
            variable.asObservable().addObserver("2").disposed(by: disposeBag)
            variable.value = "???"
            variable.value = "???"
        }
        
        example("BehaviorSubject") { 
            let disposeBag = DisposeBag()
            let subject = BehaviorSubject(value: "??")
            
            subject.addObserver("1").disposed(by: disposeBag)
            subject.onNext("??")
            subject.onNext("??")
            
            subject.addObserver("2").disposed(by: disposeBag)
            subject.onNext("???")
            subject.onNext("???")

        }

對比打印結(jié)果
可以看出Variable會自動發(fā)出Complete事件

對比結(jié)果

下一篇:RxSwift文檔翻譯3--Combination Operators

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市季蚂,隨后出現(xiàn)的幾起案子讨韭,更是在濱河造成了極大的恐慌脂信,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件透硝,死亡現(xiàn)場離奇詭異狰闪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)濒生,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門埋泵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人罪治,你說我怎么就攤上這事丽声。” “怎么了觉义?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵雁社,是天一觀的道長。 經(jīng)常有香客問我晒骇,道長霉撵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任洪囤,我火速辦了婚禮徒坡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瘤缩。我一直安慰自己喇完,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布剥啤。 她就那樣靜靜地躺著锦溪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪府怯。 梳的紋絲不亂的頭發(fā)上刻诊,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機(jī)與錄音富腊,去河邊找鬼坏逢。 笑死,一個胖子當(dāng)著我的面吹牛赘被,可吹牛的內(nèi)容都是我干的是整。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼民假,長吁一口氣:“原來是場噩夢啊……” “哼浮入!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起羊异,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤事秀,失蹤者是張志新(化名)和其女友劉穎彤断,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體易迹,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡宰衙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了睹欲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片供炼。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖窘疮,靈堂內(nèi)的尸體忽然破棺而出袋哼,到底是詐尸還是另有隱情,我是刑警寧澤闸衫,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布涛贯,位于F島的核電站,受9級特大地震影響蔚出,放射性物質(zhì)發(fā)生泄漏弟翘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一身冬、第九天 我趴在偏房一處隱蔽的房頂上張望衅胀。 院中可真熱鬧岔乔,春花似錦酥筝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至茁影,卻和暖如春宙帝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背募闲。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工步脓, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浩螺。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓靴患,卻偏偏與公主長得像,于是被迫代替她去往敵國和親要出。 傳聞我的和親對象是個殘疾皇子鸳君,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

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