RxSwift #04 | Operators

Overview

RxSwift 提供了多種操作符(Operator)藏研,如果你了解 Swift 的高階函數(shù)舷夺,比如 map(_:) 等,那么你也應(yīng)該很容易就能明白操作符做了什么事情。

RxSwift 的操作符主要有以下幾種類型:

  • Filtering Operators
  • Transforming Operators
  • Combining Operators
  • Time-Based Operators

Filtering Operators

Ignoring operators

[圖片上傳失敗...(image-fe720e-1639236680002)]

ignoreElements: 忽略所有 next 事件,只允許終止事件洽沟,比如 completed 和 error 事件。其實(shí) ignoreElements 返回的就是一個(gè) Completable蜗细。

[圖片上傳失敗...(image-1891a3-1639236680002)]

elementAt(_:): 只允許第 n 個(gè)元素通過裆操。一旦第 n 個(gè)元素通過之后,訂閱就會被終止炉媒。

[圖片上傳失敗...(image-cda43e-1639236680002)]

filter: 只允許符合條件的元素通過踪区,比如 filter { $0 < 3 } 只允許通過小于 3 的元素。

Skipping operators

[圖片上傳失敗...(image-2c4f4d-1639236680002)]

skip: 跳過前 n 個(gè)元素吊骤,只允許后面的元素通過缎岗。

[圖片上傳失敗...(image-b38da3-1639236680002)]

skipWhile: 跳過符合條件的元素。當(dāng)?shù)谝粋€(gè)允許跳過的元素被發(fā)出時(shí)白粉,后面的所有元素都允許通過传泊,包括符合條件的元素。

let disposeBag = DisposeBag()

// 1
Observable.of(2, 2, 3, 4, 4)
  // 2
  .skipWhile { $0.isMultiple(of: 2) }
  .subscribe(onNext: {
    print($0)
  })
  .disposed(by: disposeBag)

/**
    第一個(gè)允許通過的元素 3 通過后鸭巴,后面的所有元素都允許跳過眷细,即使后面的 4 也符合條件
    output: 3, 4, 4
**/

[圖片上傳失敗...(image-3389d8-1639236680002)]

skipUntil: 前面的操作符都是根據(jù)靜態(tài)條件進(jìn)行過濾,如果像動態(tài)地過濾元素鹃祖,可以使用 skipUntil 操作符溪椎。skipUntil 會持續(xù)過濾元素,直到你訂閱另一個(gè) observable 并觸發(fā)它發(fā)出元素,然后后面的所有元素都可以通過池磁。

let disposeBag = DisposeBag()

// 1
let subject = PublishSubject<String>()
let trigger = PublishSubject<String>()

// 2
subject
  .skipUntil(trigger)
  .subscribe(onNext: {
    print($0)
  })
  .disposed(by: disposeBag)

subject.onNext("A")
subject.onNext("B")

// 這里 trigger 發(fā)出了元素奔害,因此后面的 C 將不再被過濾
trigger.onNext("X")

subject.onNext("C")

// --- Example of: skipUntil ---
// C

Taking operators

Taking 正好和 Skipping 相反。

[圖片上傳失敗...(image-42ce0e-1639236680002)]

take: 只允許前 n 個(gè)元素通過地熄。

[圖片上傳失敗...(image-19786a-1639236680002)]

takeWhile: 只允許符合條件的元素通過华临。

[圖片上傳失敗...(image-43607d-1639236680002)]

takeUntil: 只發(fā)出符合條件之前的元素,.inclusive 可以允許通過第一個(gè)符合條件的元素端考。.exclusive 則不可以雅潭。比如圖示中的,第一個(gè)符合條件的元素是 2却特,如果 使用 .inclusive, 則允許通過的元素為 1, 2扶供,如果使用 .exclusive, 則允許跳過的元素為 1。

[圖片上傳失敗...(image-61a641-1639236680002)]

takeUntil:和skipUntil類似裂明,可以根據(jù)動態(tài)的條件允許元素通過椿浓。比如在另一個(gè) observable 被觸發(fā)之前的元素可以被通過。

let disposeBag = DisposeBag()

// 1
let subject = PublishSubject<String>()
let trigger = PublishSubject<String>()

// 2
subject
  .takeUntil(trigger)
  .subscribe(onNext: {
    print($0)
  })
  .disposed(by: disposeBag)

  // 3
  subject.onNext("1")
  subject.onNext("2")

// 這里 trigger 發(fā)出元素后闽晦,subject 后面發(fā)出的元素將不能通過
trigger.onNext("X")

subject.onNext("3")

/**
output: 1, 2
**/

Distinct operators

[圖片上傳失敗...(image-9a7e3c-1639236680002)]

distinctUntilChanged: 防止緊挨著的重復(fù)元素通過扳碍。比如 A, A, B, B, A, 只允許通過的元素為:A, B, A.

[圖片上傳失敗...(image-3aba38-1639236680002)]

distinctUntilChanged{}: 防止符合條件的緊挨著的元素通過。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仙蛉,一起剝皮案震驚了整個(gè)濱河市笋敞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌荠瘪,老刑警劉巖夯巷,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異哀墓,居然都是意外死亡趁餐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門篮绰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來后雷,“玉大人,你說我怎么就攤上這事阶牍。” “怎么了星瘾?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵走孽,是天一觀的道長。 經(jīng)常有香客問我琳状,道長磕瓷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮困食,結(jié)果婚禮上边翁,老公的妹妹穿的比我還像新娘。我一直安慰自己硕盹,他們只是感情好符匾,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瘩例,像睡著了一般啊胶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上垛贤,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天焰坪,我揣著相機(jī)與錄音,去河邊找鬼聘惦。 笑死某饰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的善绎。 我是一名探鬼主播黔漂,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涂邀!你這毒婦竟也來了瘟仿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤比勉,失蹤者是張志新(化名)和其女友劉穎劳较,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浩聋,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡观蜗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了衣洁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墓捻。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖坊夫,靈堂內(nèi)的尸體忽然破棺而出砖第,到底是詐尸還是另有隱情,我是刑警寧澤环凿,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布梧兼,位于F島的核電站,受9級特大地震影響智听,放射性物質(zhì)發(fā)生泄漏羽杰。R本人自食惡果不足惜渡紫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望考赛。 院中可真熱鬧惕澎,春花似錦、人聲如沸颜骤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽复哆。三九已至欣喧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間梯找,已是汗流浹背唆阿。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锈锤,地道東北人驯鳖。 一個(gè)月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像久免,于是被迫代替她去往敵國和親浅辙。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

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