RxSwift (5) 条件运算符

9 篇文章 0 订阅

filter

将信号元素 筛选 符合条件的 继续发送,不符合的舍弃

    func rx_filter(){
        let disposBag = DisposeBag()

        Observable.from(["美腿","丝袜","超短裙"])
            .filter{x in x=="美腿"}
            .subscribe{print($0)}
            .addDisposableTo(disposBag)



        print("------------------------------")
        Observable.of("萝莉","御姐","萌萌哒")
            .scan("I Like Play", accumulator: {(last,current) in last+current})
            .filter{ $0 == "I Like Play萝莉御姐"}
            .subscribe{print($0)}
            .addDisposableTo(disposBag)

    }

打印结果
next(美腿)
completed
------------------------------
next(I Like Play萝莉御姐)
completed

distinctUntilChanged

舍弃连续并且重复的信号

func rx_distinctUntilChanged(){
        let disposBag = DisposeBag()

        Observable.of("a","b","b","c","b","b","d","a")
            .distinctUntilChanged()
            .subscribe{print($0)}
            .addDisposableTo(disposBag)

    }

打印结果
next(a)
next(b)
next(c)
next(b)
next(d)
next(a)
completed

elementAt

等同于 数组的 objectAt,取第几次发出的信号

func rx_elementAt(){
        let disposeBag = DisposeBag()

        Observable.of("释放","洪荒","之力")
        .elementAt(2)
        .subscribe{print($0)}
        .addDisposableTo(disposeBag)
    }


next(之力)
completed

single

有条件:筛选条件,如果有多个满足条件的元素,满足条件的第一个元素发送,然后发送error;无条件:发送第一个元素

func rx_single(){
        let disposeBag = DisposeBag()

        print("---------缺省条件就发出第一个元素-----------")
        // 缺省条件就发出第一个元素
        Observable.of("1", "2", "3", "4", "5", "6")
            .single()
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)

        print("---------发送符合条件的元素-----------")
        Observable.of("1", "2", "3", "4", "5", "6")
            .single { $0 == "4" }
            .subscribe { print($0) }
            .disposed(by: disposeBag)


        print("---------有多个符合条件的元素-----------")
        Observable.of("1", "2", "3", "4", "5", "6")
            .single { $0 == "2" }
            .subscribe { print($0) }
            .disposed(by: disposeBag)

        print("---------没有符合条件的元素-----------")
        Observable.of("1", "2", "3", "4", "5", "6")
            .single { $0 == "7" }
            .subscribe { print($0) }
            .disposed(by: disposeBag)
    }


打印结果
---------缺省条件就发出第一个元素-----------
1
---------发送符合条件的元素-----------
next(4)
completed
---------有多个符合条件的元素-----------
next(2)
error(Sequence contains more than one element.)
---------没有符合条件的元素-----------
error(Sequence doesn't contain any elements.)

take

从序列开头的元素 ,发出指定数量的元素,就是发送几次

func rx_take(){
        let disposeBag = DisposeBag()

        Observable.of("a", "b", "c", "d", "e", "f")
            .take(4)
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)
    }

打印结果
a
b
c
d

takeLast

发送 倒数 指定数量的元素,先进先出

func rx_takeLast(){
        let disposeBag = DisposeBag()

        Observable.of("a", "b", "c", "d", "e", "f")
            .takeLast(4)
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)
    }


打印结果
c
d
e
f

takeWhile

从序列开头筛选 满足条件的信号发送,只要不满足,回收序列

func rx_takeWhile(){
        let disposeBag = DisposeBag()

        print("--------开头不满足退出无打印----------")
        Observable.of("猪", "牛", "过膝袜", "绝对领域", "马", "二次元")
            .takeWhile{x in x.characters.count>1}
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)


        print("--------开始满足条件----------")
        Observable.of(1, 2, 3, 4, 5, 6)
            .takeWhile { $0 < 4 }
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)
    }


--------开头不满足退出无打印----------
--------开始满足条件----------
1
2
3

takeUntil

本序列a 被另一个序列b关闭,当b开始发送信号的时候

func rx_takeUntil(){
let disposeBag = DisposeBag()

    let aSequence = PublishSubject<String>()
    let bSequence = PublishSubject<String>()

    sourceSequence
        .takeUntil(referenceSequence)
        .subscribe { print($0) }
        .disposed(by: disposeBag)

    sourceSequence.onNext("1")
    sourceSequence.onNext("2")
    sourceSequence.onNext("3")

    referenceSequence.onNext("0")

    sourceSequence.onNext("4")
    sourceSequence.onNext("5")
    sourceSequence.onNext("6")
    }


next(1)
next(2)
next(3)
completed

skip

从序列开头 跳过指定数量的元素

func rx_skip() {
    let disposeBag = DisposeBag()

    Observable.of("1", "2", "3", "4", "5", "6")
        .skip(2)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}


3
4
5
6

skipWhile

从序列开头,跳过 连续并且同时满足条件的信号,否则 发送信号

func rx_skipWhile(){
        let disposeBag = DisposeBag()

        print("----开头连续并且满足----")
        Observable.of(1, 2, 3, 4, 5, 6)
            .skipWhile { $0 < 4 }
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)

        print("----开头不满足----")
        Observable.of(9, 2, 3, 4, 5, 6)
            .skipWhile { $0 < 4 }
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)


        print("----开头满足不连续----")
        Observable.of(1, 9, 3, 4, 5, 6)
            .skipWhile { $0 < 4 }
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)
    }


----开头连续并且满足----
4
5
6
----开头不满足----
9
2
3
4
5
6
----开头满足不连续----
9
3
4
5
6

skipWhileWithIndex

跟skipWhile 效果一样,只是多了一个参数 index下标,可以根据index下标来设置条件

 func rx_skipWhileWithIndex(){
        let disposeBag = DisposeBag()

        print("----开头连续并且满足----")
        Observable<Int>.create{observe in
            observe.onNext(1)
            observe.onNext(2)
            observe.onNext(3)
            observe.onNext(4)
            observe.onNext(5)
            observe.onNext(6)

            return Disposables.create()
            }
            .skipWhileWithIndex {element,index in  element < 4 }
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)

        print("----开头不满足----")
        Observable.of(9, 2, 3, 4, 5, 6)
            .skipWhileWithIndex {element,index in  element < 4 }
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)


        print("----开头满足不连续----")
        Observable.of(1, 9, 3, 4, 5, 6)
            .skipWhileWithIndex {element,index in  element < 4 }
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)
    }


----开头连续并且满足----
4
5
6
----开头不满足----
9
2
3
4
5
6
----开头满足不连续----
9
3
4
5
6

skipUntil

屏蔽发射的信号,直到 参照的序列发出信号

func rx_skipUntil(){
        let disposeBag = DisposeBag()

        let sourceSequence = PublishSubject<String>()
        let referenceSequence = PublishSubject<String>()

        sourceSequence
            .skipUntil(referenceSequence)
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)

        sourceSequence.onNext("1")
        sourceSequence.onNext("2")
        sourceSequence.onNext("3")

        referenceSequence.onNext("0")

        sourceSequence.onNext("4")
        sourceSequence.onNext("5")
        sourceSequence.onNext("6")

    }


打印结果
4
5
6
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值