上篇我们讲解的RxSwift-变化操作符,那么我们今天讲解一下RxSwift-条件和布尔操作符。
条件操作符一共是五种,分别是
Amd、TakeWhile、TakeUntil、SkipWhile、SkipUntil
第一种、Amd
当传入多个 Observables 到 amb 操作符时,它将取第一个发出元素或产生事件的 Observable,然后只发出它的元素。并忽略掉其他的 Observables。
使用如下:
func RxSwiftAmd() {
// 当传入多个 Observables 到 amb 操作符时,它将取第一个发出元素或产生事件的 Observable,然后只发出它的元素。并忽略掉其他的 Observables。
let subject1 = PublishSubject<Int>()
let subject2 = PublishSubject<Int>()
let subject3 = PublishSubject<Int>()
subject1.amb(subject2).amb(subject3).subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
subject2.onNext(1)
subject1.onNext(20)
subject2.onNext(2)
subject1.onNext(40)
subject3.onNext(0)
subject2.onNext(3)
subject1.onNext(60)
subject3.onNext(0)
subject3.onNext(0)
// 结果只会输出subject2
}
运行结果如下:
1
2
3
通过结果我们很容易发现,只有subject2被执行了,因为subject2是第一个执行的,所以以后也会打印subject2的内容,而不是Observable
第二个、TakeWhile
该方法依次判断 Observable 序列的每一个值是否满足给定的条件。 当第一个不满足条件的值出现时,它便自动完成。
使用如下:
Observable<Int>.of(2,3,4,5,6).takeWhile({ $0 < 4 }).subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
运行结果果如下:
2
3
从结果我们可以很容易看出,只会打印小于4的结果,当$0 >= 4,Observable便会直接完成,不会继续打印。
第三个、TakeUntil
除了订阅源 Observable 外,通过 takeUntil 方法我们还可以监视另外一个 Observable, 即 notifier。如果 notifier 发出值或 complete 通知,那么源 Observable 便自动完成,停止发送事件。
使用如下:
func RxSwiftTakeUntil() {
/*
除了订阅源 Observable 外,通过 takeUntil 方法我们还可以监视另外一个 Observable, 即 notifier。
如果 notifier 发出值或 complete 通知,那么源 Observable 便自动完成,停止发送事件。
*/
let source = PublishSubject<String>()
let notifier = PublishSubject<String>()
source.takeUntil(notifier).subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
source.onNext("a")
source.onNext("b")
source.onNext("c")
source.onNext("d")
//停止接收消息
notifier.onNext("z")
source.onNext("e")
source.onNext("f")
source.onNext("g")
// 只会输出abcd
}
结果如下:
a
b
c
d
通过上面结果我们可以看出,当notifier发送onNext后,source调用onNext就不会在起作用,也就是Observable直接种植。
第四个、SkipWhile
该方法用于跳过前面所有满足条件的事件。与TakeWhile相反,一旦遇到不满足条件的事件,之后就不会再跳过了。
使用如下:
Observable<Int>.of(2,3,4,5,6).skipWhile({ $0 < 4 }).subscribe(onNext: { print($0) }).disposed(by: disposeBag)
结果如下:
4
5
6
很明显SkipWhile与TakeWhile完全相反,当遇到第一个不满足便会打印以后的结果,前面符合要求的便会打印。
第五个、SkipUntil
同上面的 takeUntil 一样,skipUntil 除了订阅源 Observable 外,通过 skipUntil方法我们还可以监视另外一个 Observable, 即 notifier 。 与 takeUntil 相反的是。源 Observable 序列事件默认会一直跳过,直到 notifier 发出值或 complete 通知
使用如下:
func RxSwiftSkipUntil() {
/*
同上面的 takeUntil 一样,skipUntil 除了订阅源 Observable 外,通过 skipUntil方法我们还可以监视另外一个 Observable, 即 notifier 。
与 takeUntil 相反的是。源 Observable 序列事件默认会一直跳过,直到 notifier 发出值或 complete 通知
*/
let source = PublishSubject<Int>()
let notifier = PublishSubject<Int>()
source.skipUntil(notifier).subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
source.onNext(1)
source.onNext(2)
source.onNext(3)
source.onNext(4)
source.onNext(5)
//开始接收消息
notifier.onNext(0)
source.onNext(6)
source.onNext(7)
source.onNext(8)
//仍然接收消息
notifier.onNext(0)
source.onNext(9)
// 会输出6,7,8,9
}
结果如下:
6
7
8
9
通过结果我们可以看出SkipUntil与takeUntil的表现是完全相反的,只有接收到notifier发出的内容,source以后发送的结果才能收到。
到此RxSwift-条件和布尔操作符的条件操作符就讲解完成了。
下面是本人学习过程自己写的一个demo,感兴趣的小伙伴大家可以下载看一看。