上篇我们讲解的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,感兴趣的小伙伴大家可以下载看一看。
转载:https://blog.csdn.net/WangQingLei0307/article/details/116209152