对于
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












网友评论