RxSwift操作符take、skip、materialize、withLatestFrom、interval等的使用

简介: RxSwift操作符take、skip、materialize、withLatestFrom、interval等的使用


01. of、just、from

of: 将一系列元素转换为Observable并发出;

just: 只能发出一个元素;

from: 将数组中一系列元素转换为Observable并发出;

仅发出一个元素时,三种用法等价:

func test_of_from_just() {
    Observable.of(1)
    Observable.of(1, 2, 3, 4)
    Observable.just(1)
    Observable.from([1])
    Observable.from([1, 2, 3, 4])
}


02. take相关

1. 通过take操作符可以只发出头n个元素,并且忽略掉后面的元素,直接结束序列;


func testTake() {
    let observable = Observable.of(1, 3, 5, 7)
    observable.take(2).subscribe(onNext: { (value) in
        Logger(value)
    }, onCompleted: {
        Logger("onCompleted end")
    }).disposed(by: disposeBag)
}

运行结果:

Log - 1
Log - 3
Log - onCompleted end


2. take(while: Element -> Bool)操作符将Observable直到某个元素的判定为false,这个Observable将立即终止;

func testTakeWhile() {
    let observable = Observable.of(7, 3, 2, 1)
    observable.take(while: { $0 > 2 }).subscribe(onNext: { (value) in
        Logger(value)
    }, onCompleted: {
        Logger("onCompleted end")
    }).disposed(by: disposeBag)
}

运行结果:

Log - 7
Log - 3
Log - onCompleted end


3. take(until: Element -> Bool)操作符将镜像源Observable,它同时观测第二个Observable,一旦第二个Observable发出一个元素或者产生一个终止事件,那个镜像的Observable将立即终止;


func testTakeUntil() {
    let observable = Observable.of(1, 3, 5, 7)
    observable.take(until: { $0 > 3}).subscribe(onNext: { (value) in
        Logger(value)
    }, onCompleted: {
        Logger("onCompleted end")
    }).disposed(by: disposeBag)
}

运行结果:

Log - 1
Log - 3
Log - onCompleted end


03. skip相关

1. skip操作符跳过Observable中头n个元素,只关注后面的元素;

func testSkip() {
    let observable = Observable.of(1, 3, 5, 7)
    observable.skip(2).subscribe(onNext: { (value) in
        Logger(value)
    }, onCompleted: {
        Logger("onCompleted end")
    }).disposed(by: disposeBag)
}

运行结果:

Log - 5
Log - 7
Log - onCompleted end


2. skip(while: Element -> Bool)操作符可以让你忽略源Observable中头几个元素,直到元素的判定为否后,它才镜像源Observable

func testSkipWhile() {
    let observable = Observable.of(7, 5, 1, 3)
    observable.skip(while: { $0 > 3 }).subscribe(onNext: { (value) in
        Logger(value)
    }, onCompleted: {
        Logger("onCompleted end")
    }).disposed(by: disposeBag)
}

运行结果:

Log - 1
Log - 3
Log - onCompleted end


3. skipUntil操作符可以让你忽略源Observable中头几个元素,直到另一个Observable发出一个元素后,它才镜像源Observable


func testSkipUntil() {
    let source = PublishSubject<Int>()
    let refSource = PublishSubject<Int>()
    source.skip(until: refSource).subscribe(onNext: { (value) in
        Logger(value)
    }, onCompleted: {
        Logger("onCompleted end")
    }).disposed(by: disposeBag)
    source.onNext(1)
    source.onNext(2)
    refSource.onNext(3)
    source.onNext(4)
    source.onNext(5)
}

运行结果:



Log - 4
Log - 5


04. materialize

通常,一个Observable将产生零个或者多个onNext事件,然后产生一个onCompleted或者onError事件;

materialize操作符将Observable产生的这些事件全部转换成元素,然后发送出来;


func testMaterialize() {
    let observable = Observable.of(1, 3, 5, 7)
    observable.materialize().subscribe(onNext: { (event) in
        //正常情况下这里应该是一个值,使用materialize后这里都转换为了Event
        switch event {
        case .next(let value):
            Logger(value)
            break
        case .completed:
            Logger("completed")
            break
        default:
            Logger("defalut value")
        }
    }, onCompleted: {
        Logger("onCompleted end")
    }).disposed(by: disposeBag)
}

运行结果:

Log - 1
Log - 3
Log - 5
Log - 7
Log - completed
Log - onCompleted end


05. withLatestFrom

1. withLatestFrom(_:)当第一个Observable发出一个元素时,就立即取出第二个Observable中最新的元素(前提是第二个发出过元素),然后把第二个Observable中最新的元素发送出去;

func testWithLatestFrom() {
    let source = PublishSubject<Int>()
    let refSource = PublishSubject<Int>()
    source.withLatestFrom(refSource).subscribe(onNext: { (value) in
        Logger("\(value)")
    }, onCompleted: {
        Logger("onCompleted end")
    }).disposed(by: disposeBag)
    source.onNext(1)
    source.onNext(2)
    refSource.onNext(3)
    refSource.onNext(4)
    source.onNext(5)
    source.onNext(6)
}

运行结果:



Log - 4
Log - 4


2. withLatestFrom(_:resultSelector:)操作符当第一个Observable发出一个元素时,就立即取出第二个Observable中最新的元素(前提是第二个发出过元素),将第一个Observable中最新的元素first和第二个Observable中最新的元素second组合,然后把组合结果first+second发送出去;

func testWithLatestFromResultSelector() {
    let source = PublishSubject<Int>()
    let refSource = PublishSubject<Int>()
    source.withLatestFrom(refSource) { (first, second) -> Int in
        return first + second
    }.subscribe(onNext: { (value) in
        Logger("\(value)")
    }, onCompleted: {
        Logger("onCompleted end")
    }).disposed(by: disposeBag)
    source.onNext(1)
    source.onNext(2)
    refSource.onNext(3)
    refSource.onNext(4)
    source.onNext(5)
    source.onNext(6)
}

运行结果:



Log - 9
Log - 10


06. timer

timer操作符将创建一个Observable,它在经过设定的一段时间后,产生唯一的一个元素

func testTimer() {
    let relay = Observable<Int>.timer(.seconds(1), scheduler: MainScheduler.instance)
    relay.subscribe(onNext: { (value) in
        Logger("\(value) - \(Thread.current)")
    }, onCompleted: {
        Logger("onCompleted end")
    }).disposed(by: disposeBag)
}

运行结果:


Log - 0 - <NSThread: 0x600002778980>{number = 1, name = main}
Log - onCompleted end


07. interval

interval(定时器)操作符将创建一个Observable,它每隔一段设定的时间,发出一个索引数的元素,它将发出无数个元素;

func testInterval() {
    let relay = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
    relay.subscribe(onNext: { (value) in
        Logger("\(value) - \(Thread.current)")
    }, onCompleted: {
        Logger("onCompleted end")
    }).disposed(by: disposeBag)
}

运行结果:

Log - 0 - <NSThread: 0x600002138400>{number = 1, name = main}
Log - 1 - <NSThread: 0x600002138400>{number = 1, name = main}
Log - 2 - <NSThread: 0x600002138400>{number = 1, name = main}
...
相关文章
|
3月前
|
安全 算法 数据挖掘
文献解读 -Profiling SARS-CoV-2 mutation fingerprints that range from the viral pangenome to individual infection quasispecies
研究者对病毒突变谱进行了分析,为遗传指纹提供了基础。该研究将泛基因组分析与有针对性的深度测序SARS-CoV-2临床样本联系起来,确定了个体患者体内发生的准物种突变,并与超过70,000种其他菌株相比确定了它们的一般患病率。对这些遗传指纹的分析可以提供一种进行分子接触追踪的方法。
28 2
文献解读 -Profiling SARS-CoV-2 mutation fingerprints that range from the viral pangenome to individual infection quasispecies
6. loop_interval: 600 这个参数是干啥的
6. loop_interval: 600 这个参数是干啥的
|
4月前
|
机器学习/深度学习 关系型数据库 Ruby
GitlabCI学习笔记之三:GitLabRunner pipeline语法之tags allow_faillure when retry timeout parallel
GitlabCI学习笔记之三:GitLabRunner pipeline语法之tags allow_faillure when retry timeout parallel
|
6月前
|
编译器 C++ 开发者
C++一分钟之-返回值优化与Move Semantics
【6月更文挑战第19天】C++的RVO与移动语义提升效率,减少对象复制。RVO是编译器优化,避免临时对象的创建。移动语义通过右值引用和`std::move`转移资源所有权。注意RVO不是总有效,不应过度依赖。使用移动语义时,避免误用`std::move`导致对象无效。示例展示了RVO和移动构造函数的应用。理解并恰当使用这些机制能写出更高效代码。
72 3
|
7月前
|
安全 JavaScript 前端开发
为啥加问号?可选链(Optional Chaining)的操作符
为啥加问号?可选链(Optional Chaining)的操作符
|
SQL 关系型数据库 MySQL
一文速学-玩转MySQL中INTERVAL关键字和INTERVAL()函数用法讲解
一文速学-玩转MySQL中INTERVAL关键字和INTERVAL()函数用法讲解
838 0
一文速学-玩转MySQL中INTERVAL关键字和INTERVAL()函数用法讲解
|
索引
RxSwift操作符merge、zip、combinLatest的使用
RxSwift操作符merge、zip、combinLatest的使用
398 0
|
JSON Go 开发者
GoFrame必知必会之Scan:类型转换
Scan转换方法可以实现对任意参数到struct/struct数组/map/map数组的转换,并且根据开发者输入的转换目标参数自动识别执行转换。
205 0
GoFrame必知必会之Scan:类型转换
|
移动开发 缓存 HTML5
是时候学习/推广一波可选链(Optional chaining)和空值合并(Nullish coalescing )了
最近工作中发现团队有些同学不太了解 Optional chaining 和 Nullish coalescing 两个新的操作符,正好推广一波。
是时候学习/推广一波可选链(Optional chaining)和空值合并(Nullish coalescing )了
|
C语言 Python
【Python函数式编程】——高阶函数(Higher-order function)
函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。
220 0
【Python函数式编程】——高阶函数(Higher-order function)