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

19 篇文章 1 订阅
7 篇文章 2 订阅

上篇我们讲解的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-条件和布尔操作符的条件操作符就讲解完成了。

Swift RxSwift-结合操作符(七)

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


Csdn下载

Gitbub下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王 哪跑!!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值