对于
RxSwift
的重点学习,我们还得需要知道RxSwift
的高阶函数,掌握好了RxSwift
的高阶函数,是你通往成功的捷径,这篇文章,我来介绍几个我觉得很重要的RxSwift
的高阶函数,便于以后自己查阅。
filter
filter
函数仅仅发出Observable
中通过判定的元素- 它将通过你提供的判定方法过滤一个
Observable
。
代码演示如下:
let disposeBag = DisposeBag()
Observable.of(2, 30, 22, 5, 60, 1)
.filter { $0 > 10 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
输出结果:
30
22
60
flatMap
- 将
Observable
的元素转换成其他的Observable
,然后将这些Observables
合并flatMap
操作符将源Observable
的每一个元素应用一个转换方法,将他们转换成Observables
。 然后将这些Observables
的元素合并之后再发送出来。- 这个操作符是非常有用的,例如,当
Observable
的元素本身拥有其他的Observable
时,你可以将所有子Observables
的元素发送出来。
代码演示如下:
let disposeBag = DisposeBag()
let first = BehaviorSubject(value: "👦🏻")
let second = BehaviorSubject(value: "🅰️")
let variable = Variable(first)
variable.asObservable()
.flatMap { $0 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
first.onNext("🐱")
variable.value = second
second.onNext("🅱️")
first.onNext("🐶")
输出结果:
👦🏻
🐱
🅰️
🅱️
🐶
flatMapLatest
- 将
Observable
的元素转换成其他的 Observable,然后取这些Observables
中最新的一个- f
latMapLatest
操作符将源Observable
的每一个元素应用一个转换方法,将他们转换成Observables
。一旦转换出一个新的Observable
,就只发出它的元素,旧的Observables
的元素将被忽略掉。- 将其与
flatMap
比较学习更容易理解
代码演示如下:
let disposeBag = DisposeBag()
let first = BehaviorSubject(value: "👦🏻")
let second = BehaviorSubject(value: "🅰️")
let variable = Variable(first)
variable.asObservable()
.flatMapLatest { $0 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
first.onNext("🐱")
variable.value = second
second.onNext("🅱️")
first.onNext("🐶")
输出结果:
👦🏻
🐱
🅰️
🅱️
distinctUntilChanged
- 阻止
Observable
发出相同的元素distinctUntilChanged
操作符将阻止Observable
发出相同的元素。如果后一个元素和前一个元素是相同的,那么这个元素将不会被发出来。如果后一个元素和前一个元素不相同,那么这个元素才会被发出来。
代码演示如下:
let disposeBag = DisposeBag()
Observable.of("🐱", "🐷", "🐱", "🐱", "🐱", "🐵", "🐱")
.distinctUntilChanged()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
输出结果:
🐱
🐷
🐱
🐵
🐱
elementAt
- 只发出
Observable
中的第 n 个元素elementAt
操作符将拉取Observable
序列中指定索引数的元素,然后将它作为唯一的元素发出。
代码演示如下:
let disposeBag = DisposeBag()
Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
.elementAt(3)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
输出结果:
🐸
ignoreElements
- 忽略掉所有的元素,只发出
error
或completed
事件ignoreElements
操作符将阻止Observable
发出next
事件,但是允许他发出error
或completed
事件。- 如果你并不关心
Observable
的任何元素,你只想知道Observable
在什么时候终止,那就可以使用ignoreElements
操作符。
take
- 仅仅从
Observable
中发出头 n 个元素
通过take
操作符你可以只发出头 n 个元素。并且忽略掉后面的元素,直接结束序列
代码演示如下:
let disposeBag = DisposeBag()
Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
.take(3)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
输出结果:
🐱
🐰
🐶
takeLast
- 仅仅从
Observable
中发出尾部 n 个元素- 通过
takeLast
操作符你可以只发出尾部 n 个元素。并且忽略掉前面的元素。
代码演示如下:
let disposeBag = DisposeBag()
Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
.takeLast(3)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
输出结果:
🐸
🐷
🐵
skip
- 跳过
Observable
中头 n 个元素skip
操作符可以让你跳过Observable
中头 n 个元素,只关注后面的元素。
代码演示如下:
let disposeBag = DisposeBag()
Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
.skip(2)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
输出结果:
🐶
🐸
🐷
🐵
sample
sample
操作符将不定期的对源Observable
进行取样操作。通过第二个Observable
来控制取样时机。一旦第二个Observable
发出一个元素,就从源Observable
中取出最后产生的元素。
debounce
- 过滤掉高频产生的元素
debounce
操作符将发出这种元素,在Observable
产生这种元素后,一段时间内没有新元素产生。
groupBy
- 将源
Observable
分解为多个子Observable
,并且每个子Observable
将源Observable
中“相似”的元素发送出来groupBy
操作符将源Observable
分解为多个子Observable
,然后将这些子Observable
发送出来。它会将元素通过某个键进行分组,然后将分组后的元素序列以Observable
的形态发送出来。
concatMap
- 将
Observable
的元素转换成其他的Observable
,然后将这些Observables
串连起来concatMap
操作符将源Observable
的每一个元素应用一个转换方法,将他们转换成Observables
。然后让这些Observables
按顺序的发出元素,当前一个Observable
元素发送完毕后,后一个Observable
才可以开始发出元素。等待前一个Observable
产生完成事件后,才对后一个Observable
进行订阅。
代码演示如下:
let disposeBag = DisposeBag()
let subject1 = BehaviorSubject(value: "🍎")
let subject2 = BehaviorSubject(value: "🐶")
let variable = Variable(subject1)
variable.asObservable()
.concatMap { $0 }
.subscribe { print($0) }
.disposed(by: disposeBag)
subject1.onNext("🍐")
subject1.onNext("🍊")
variable.value = subject2
subject2.onNext("I would be ignored")
subject2.onNext("🐱")
subject1.onCompleted()
subject2.onNext("🐭")
输出结果:
next(🍎)
next(🍐)
next(🍊)
next(🐱)
next(🐭)
map
- 通过一个转换函数,将
Observable
的每个元素转换一遍map
操作符将源Observable
的每个元素应用你提供的转换方法,然后返回含有转换结果的Observable
。
代码演示如下:
let disposeBag = DisposeBag()
Observable.of(1, 2, 3)
.map { $0 * 10 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
输出结果:
10
20
30
常用的高阶函数大概就这些了,需要了解其他知识,请往这里看👀RxSwift
网友评论