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{}
: 防止符合條件的緊挨著的元素通過。