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}
...
相关文章
|
10月前
13avalon - 指令ms-skip (skip绑定)
13avalon - 指令ms-skip (skip绑定)
37 0
|
2月前
|
编译器 C++ 开发者
C++一分钟之-返回值优化与Move Semantics
【6月更文挑战第19天】C++的RVO与移动语义提升效率,减少对象复制。RVO是编译器优化,避免临时对象的创建。移动语义通过右值引用和`std::move`转移资源所有权。注意RVO不是总有效,不应过度依赖。使用移动语义时,避免误用`std::move`导致对象无效。示例展示了RVO和移动构造函数的应用。理解并恰当使用这些机制能写出更高效代码。
36 3
|
2月前
|
消息中间件 监控 Serverless
函数计算操作报错合集之显示报错:RecursionError: maximum recursion depth exceeded while calling a Python object,该如何解决
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
10月前
SAP Infinite Transaction with Update 的一个具体例子
SAP Infinite Transaction with Update 的一个具体例子
|
11月前
|
索引
rxjs 里 Skip 操作符的一个使用场景
rxjs 里 Skip 操作符的一个使用场景
|
SQL 关系型数据库 MySQL
一文速学-玩转MySQL中INTERVAL关键字和INTERVAL()函数用法讲解
一文速学-玩转MySQL中INTERVAL关键字和INTERVAL()函数用法讲解
612 0
一文速学-玩转MySQL中INTERVAL关键字和INTERVAL()函数用法讲解
ES 布尔查询中 minimum_should_match 参数使用避坑
ES 布尔查询中 minimum_should_match 参数使用避坑
|
C语言 Python
【Python函数式编程】——高阶函数(Higher-order function)
函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。
202 0
【Python函数式编程】——高阶函数(Higher-order function)
rxjs里delay operators的用法
rxjs里delay operators的用法
93 0
rxjs里delay operators的用法
rxjs里scan operators的用法
rxjs里scan operators的用法
68 0
rxjs里scan operators的用法