Swift - RxSwift的使用詳解11(結合操作符:startWith莹菱、merge、zip等)

十一雷客、結合操作(Combining Observables)

結合操作(或者稱合并操作)指的是將多個 Observable 序列進行組合芒珠,拼裝成一個新的 Observable 序列。

1搅裙,startWith

(1)基本介紹

  • 該方法會在 Observable 序列開始之前插入一些事件元素皱卓。即發(fā)出事件消息之前,會先發(fā)出這些預先插入的事件消息部逮。

(2)使用樣例

let disposeBag = DisposeBag()
         
Observable.of("2", "3")
    .startWith("1")
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

運行結果如下:

(3)當然插入多個數(shù)據(jù)也是可以的

let disposeBag = DisposeBag()
 
Observable.of("2", "3")
    .startWith("a")
    .startWith("b")
    .startWith("c")
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

運行結果如下:

2娜汁,merge

(1)基本介紹

  • 該方法可以將多個(兩個或兩個以上的)Observable 序列合并成一個 Observable序列。

(2)使用樣例

let disposeBag = DisposeBag()
         
let subject1 = PublishSubject<Int>()
let subject2 = PublishSubject<Int>()
 
Observable.of(subject1, subject2)
    .merge()
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)
 
subject1.onNext(20)
subject1.onNext(40)
subject1.onNext(60)
subject2.onNext(1)
subject1.onNext(80)
subject1.onNext(100)
subject2.onNext(1)

運行結果如下:

3兄朋,zip

(1)基本介紹

  • 該方法可以將多個(兩個或兩個以上的)Observable 序列壓縮成一個 Observable 序列掐禁。
  • 而且它會等到每個 Observable 事件一一對應地湊齊之后再合并。

(2)使用樣例

let disposeBag = DisposeBag()
         
let subject1 = PublishSubject<Int>()
let subject2 = PublishSubject<String>()
 
Observable.zip(subject1, subject2) {
    "\($0)\($1)"
    }
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)
 
subject1.onNext(1)
subject2.onNext("A")
subject1.onNext(2)
subject2.onNext("B")
subject2.onNext("C")
subject2.onNext("D")
subject1.onNext(3)
subject1.onNext(4)
subject1.onNext(5)

運行結果如下:

4颅和,combineLatest

(1)基本介紹

  • 該方法同樣是將多個(兩個或兩個以上的)Observable 序列元素進行合并傅事。
  • 但與 zip 不同的是,每當任意一個 Observable 有新的事件發(fā)出時峡扩,它會將每個 Observable 序列的最新的一個事件元素進行合并蹭越。

(2)使用樣例

let disposeBag = DisposeBag()
         
let subject1 = PublishSubject<Int>()
let subject2 = PublishSubject<String>()
 
Observable.combineLatest(subject1, subject2) {
    "\($0)\($1)"
    }
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)
 
subject1.onNext(1)
subject2.onNext("A")
subject1.onNext(2)
subject2.onNext("B")
subject2.onNext("C")
subject2.onNext("D")
subject1.onNext(3)
subject1.onNext(4)
subject1.onNext(5)

運行結果如下:

5,withLatestFrom

(1)基本介紹

  • 該方法將兩個 Observable 序列合并為一個教届。每當 self 隊列發(fā)射一個元素時响鹃,便從第二個序列中取出最新的一個值。

(2)使用樣例

let disposeBag = DisposeBag()
 
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
 
subject1.withLatestFrom(subject2)
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)
 
subject1.onNext("A")
subject2.onNext("1")
subject1.onNext("B")
subject1.onNext("C")
subject2.onNext("2")
subject1.onNext("D")

運行結果如下:

6案训,switchLatest

(1)基本介紹

  • switchLatest 有點像其他語言的switch 方法买置,可以對事件流進行轉換。
  • 比如本來監(jiān)聽的 subject1强霎,我可以通過更改 variable 里面的 value 更換事件源忿项。變成監(jiān)聽 subject2

(2)使用樣例

let disposeBag = DisposeBag()
 
let subject1 = BehaviorSubject(value: "A")
let subject2 = BehaviorSubject(value: "1")
 
let variable = Variable(subject1)
 
variable.asObservable()
    .switchLatest()
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)
 
subject1.onNext("B")
subject1.onNext("C")
 
//改變事件源
variable.value = subject2
subject1.onNext("D")
subject2.onNext("2")
 
//改變事件源
variable.value = subject1
subject2.onNext("3")
subject1.onNext("E")

運行結果如下:

RxSwift使用詳解系列
原文出自:www.hangge.com轉載請保留原文鏈接

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末城舞,一起剝皮案震驚了整個濱河市轩触,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌椿争,老刑警劉巖怕膛,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熟嫩,死亡現(xiàn)場離奇詭異秦踪,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門椅邓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柠逞,“玉大人,你說我怎么就攤上這事景馁“遄常” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵合住,是天一觀的道長绰精。 經常有香客問我,道長透葛,這世上最難降的妖魔是什么笨使? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮僚害,結果婚禮上硫椰,老公的妹妹穿的比我還像新娘。我一直安慰自己萨蚕,他們只是感情好靶草,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岳遥,像睡著了一般奕翔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寒随,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天糠悯,我揣著相機與錄音,去河邊找鬼妻往。 笑死草冈,一個胖子當著我的面吹牛,可吹牛的內容都是我干的店读。 我是一名探鬼主播嫁艇,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼好渠!你這毒婦竟也來了昨稼?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拳锚,失蹤者是張志新(化名)和其女友劉穎假栓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霍掺,經...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡匾荆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年拌蜘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牙丽。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡简卧,死狀恐怖,靈堂內的尸體忽然破棺而出烤芦,到底是詐尸還是另有隱情举娩,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布构罗,位于F島的核電站铜涉,受9級特大地震影響,放射性物質發(fā)生泄漏遂唧。R本人自食惡果不足惜骄噪,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蠢箩。 院中可真熱鬧链蕊,春花似錦、人聲如沸谬泌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掌实。三九已至陪蜻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贱鼻,已是汗流浹背宴卖。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留邻悬,地道東北人症昏。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像父丰,于是被迫代替她去往敵國和親肝谭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內容