飞道的博客

iOS Swift RxSwift-条件和布尔操作符(六)

358人阅读  评论(0)

上篇我们讲解的RxSwift-变化操作符,那么我们今天讲解一下RxSwift-条件和布尔操作符

条件操作符一共是五种,分别是

Amd、TakeWhile、TakeUntil、SkipWhile、SkipUntil

第一种、Amd

当传入多个 Observables 到 amb 操作符时,它将取第一个发出元素或产生事件的 Observable,然后只发出它的元素。并忽略掉其他的 Observables。

使用如下:


  
  1. func RxSwiftAmd() {
  2. // 当传入多个 Observables 到 amb 操作符时,它将取第一个发出元素或产生事件的 Observable,然后只发出它的元素。并忽略掉其他的 Observables。
  3. let subject1 = PublishSubject< Int>()
  4. let subject2 = PublishSubject< Int>()
  5. let subject3 = PublishSubject< Int>()
  6. subject1.amb(subject2).amb(subject3).subscribe(onNext: {
  7. print($ 0)
  8. }).disposed(by: disposeBag)
  9. subject2.onNext( 1)
  10. subject1.onNext( 20)
  11. subject2.onNext( 2)
  12. subject1.onNext( 40)
  13. subject3.onNext( 0)
  14. subject2.onNext( 3)
  15. subject1.onNext( 60)
  16. subject3.onNext( 0)
  17. subject3.onNext( 0)
  18. // 结果只会输出subject2
  19. }

运行结果如下:


  
  1. 1
  2. 2
  3. 3

通过结果我们很容易发现,只有subject2被执行了,因为subject2是第一个执行的,所以以后也会打印subject2的内容,而不是Observable


第二个、TakeWhile

该方法依次判断 Observable 序列的每一个值是否满足给定的条件。 当第一个不满足条件的值出现时,它便自动完成。

使用如下:


  
  1. Observable< Int>.of( 2, 3, 4, 5, 6).takeWhile({ $ 0 < 4 }).subscribe(onNext: {
  2. print($ 0)
  3. }).disposed(by: disposeBag)

运行结果果如下:


  
  1. 2
  2. 3

从结果我们可以很容易看出,只会打印小于4的结果,当$0 >= 4,Observable便会直接完成,不会继续打印。


第三个、TakeUntil

除了订阅源 Observable 外,通过 takeUntil 方法我们还可以监视另外一个 Observable, 即 notifier。如果 notifier 发出值或 complete 通知,那么源 Observable 便自动完成,停止发送事件。

使用如下:


  
  1. func RxSwiftTakeUntil() {
  2. /*
  3. 除了订阅源 Observable 外,通过 takeUntil 方法我们还可以监视另外一个 Observable, 即 notifier。
  4. 如果 notifier 发出值或 complete 通知,那么源 Observable 便自动完成,停止发送事件。
  5. */
  6. let source = PublishSubject< String>()
  7. let notifier = PublishSubject< String>()
  8. source.takeUntil(notifier).subscribe(onNext: {
  9. print($ 0)
  10. }).disposed(by: disposeBag)
  11. source.onNext( "a")
  12. source.onNext( "b")
  13. source.onNext( "c")
  14. source.onNext( "d")
  15. //停止接收消息
  16. notifier.onNext( "z")
  17. source.onNext( "e")
  18. source.onNext( "f")
  19. source.onNext( "g")
  20. // 只会输出abcd
  21. }

结果如下:


  
  1. a
  2. b
  3. c
  4. 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)

结果如下:


  
  1. 4
  2. 5
  3. 6

很明显SkipWhile与TakeWhile完全相反,当遇到第一个不满足便会打印以后的结果,前面符合要求的便会打印。


第五个、SkipUntil

同上面的 takeUntil 一样,skipUntil 除了订阅源 Observable 外,通过 skipUntil方法我们还可以监视另外一个 Observable, 即 notifier 。 与 takeUntil 相反的是。源 Observable 序列事件默认会一直跳过,直到 notifier 发出值或 complete 通知

使用如下:


  
  1. func RxSwiftSkipUntil() {
  2. /*
  3. 同上面的 takeUntil 一样,skipUntil 除了订阅源 Observable 外,通过 skipUntil方法我们还可以监视另外一个 Observable, 即 notifier 。
  4. 与 takeUntil 相反的是。源 Observable 序列事件默认会一直跳过,直到 notifier 发出值或 complete 通知
  5. */
  6. let source = PublishSubject< Int>()
  7. let notifier = PublishSubject< Int>()
  8. source.skipUntil(notifier).subscribe(onNext: {
  9. print($ 0)
  10. }).disposed(by: disposeBag)
  11. source.onNext( 1)
  12. source.onNext( 2)
  13. source.onNext( 3)
  14. source.onNext( 4)
  15. source.onNext( 5)
  16. //开始接收消息
  17. notifier.onNext( 0)
  18. source.onNext( 6)
  19. source.onNext( 7)
  20. source.onNext( 8)
  21. //仍然接收消息
  22. notifier.onNext( 0)
  23. source.onNext( 9)
  24. // 会输出6,7,8,9
  25. }

结果如下:


  
  1. 6
  2. 7
  3. 8
  4. 9

通过结果我们可以看出SkipUntil与takeUntil的表现是完全相反的,只有接收到notifier发出的内容,source以后发送的结果才能收到。

到此RxSwift-条件和布尔操作符的条件操作符就讲解完成了。

下面是本人学习过程自己写的一个demo,感兴趣的小伙伴大家可以下载看一看。


Csdn下载

Gitbub下载


转载:https://blog.csdn.net/WangQingLei0307/article/details/116209152
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场