欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

RxSwift笔记 - Observable Utility Operators

程序员文章站 2022-07-14 22:29:48
...


Delay

该操作符会将 Observable 的所有元素都先拖延一段设定好的时间,然后才将它们发送出来

RxSwift笔记 - Observable Utility Operators

Observable.of(1, 2, 1)
            .delay(3, scheduler: MainScheduler.instance) //元素延迟3秒才发出
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)

Do

注册一个动作作为原始 Observable 生命周期事件的一种占位符

RxSwift笔记 - Observable Utility Operators

Observable.of(1, 2, 3)
        .do(onNext: { print($0*2) })
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

/*
2
1
4
2
6
3
*/

Materialize

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

RxSwift笔记 - Observable Utility Operators

Observable.of(1, 2, 1)
            .materialize()
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)

/*
next(1)
next(2)
next(3)
completed
*/

Dematerialize

和 Materialize 正好相反,它可以将 Materialize 转换后的元素还原

RxSwift笔记 - Observable Utility Operators

Observable.of(1, 2, 1)
            .materialize()
            .dematerialize()
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)

/*
1
2
1
*/

ObserveOn

指定 Observable 在那个 Scheduler 发出通知

RxSwift笔记 - Observable Utility Operators

Observable.of(1, 2, 1).observeOn(MainScheduler.instance)
    .subscribe(onNext: { value in
        print(value)
    }).disposed(by: disposeBag)

SubscribeOn

指定 Observable 在那个 Scheduler 执行

RxSwift笔记 - Observable Utility Operators

Observable.of(1, 2, 1).subscribeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated))
    .subscribe(onNext: { value in
    print(value)
}).disposed(by: disposeBag)

ObserveOn + subscribeOn 结合使用

RxSwift笔记 - Observable Utility Operators

Observable.of(1, 2, 1).subscribeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated))
    .observeOn(MainScheduler.instance)
    .subscribe(onNext: { data in
    print(data)
}).disposed(by: disposeBag)

Timeout

使用该操作符可以设置一个超时时间。如果源 Observable 在规定时间内没有发任何出元素,就产生一个超时的 error 事件

RxSwift笔记 - Observable Utility Operators

Observable.of(1, 2, 1).map({ item in
    //元素延迟3秒才发出
    return Observable.of(item).delay(3, scheduler: MainScheduler.instance)
}).timeout(2, scheduler: MainScheduler.instance) //超过两秒没发出元素,则产生error事件
  .subscribe(onNext: { print($0) })
  .disposed(by: disposeBag)

 /*
 sequence timeout
 */

Using

使用 using 操作符创建 Observable 时,同时会创建一个可被清除的资源,一旦 Observable 终止了,那么这个资源就会被清除掉了

RxSwift笔记 - Observable Utility Operators