RxSwift核心之序列的创建、订阅与销毁

简介: RxSwift核心之序列的创建、订阅与销毁

1. RxSwift核心

Observable:产生产生事件(Event)

Observer:负责订阅Observable,响应Observable产生的事件(Event)

Disposable管理绑定(订阅)的生命周期


2. 什么是序列?

一切事物皆是序列。比如把网络请求的返回的JSON看作是一个序列,然后当取到 JSON 时,将它打印出来;再比如把任务回调看作是一个序列。当任务结束后,提示用户任务已完成。


3. 序列的创建(Observable)

可以使用以下几种方式创建Observableobservable1中使用onNext(Event)发出元素,其他几种方式均为常用的操作符进行的创建

let observable1 = Observable<Int>.create { (observer) -> Disposable in
    observer.onNext(1)
    observer.onCompleted()
    return Disposables.create()
}
let observable2 = Observable.just(1)
let observable3 = Observable.of(1)
let observable4 = Observable.from([1])
let observable5 = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)


4. 序列的订阅(Observer)

方式一:直接创建AnyObserver进行订阅,监听next(Element)元素或者error(Swift.Error)错误事件或者completed完成事件


let observer: AnyObserver<Int> = AnyObserver { (event) in
    switch event {
    case .next(let res):
        print(res)
        break
    case .completed:
        print("completed")
        break
    case .error(let err):
        print(err is TestError)
        break
    }
}
observable1.subscribe(observer)

方式二:直接调用subscribe进行订阅

observable1.subscribe { (value) in
    print(value)
} onError:
 { (err) 
in
    print(err is TestError)
} onCompleted:
 {
    print("completed")
} onDisposed: {
    print("onDisposed")
}

方式三:通过Binder绑定,把Observable的结果通过map转换绑定到某个元素上进行订阅,其中label.rx.textBinder<String?>类型



let label = UILabel()
observable1.map({ "\($0)" }).bind(to: label.rx.text)


5. 销毁(Disposable)

每当一个Observable被订阅的时候,这个函数就会返回一个Disposeable实例,通常来说,一个序列如果发出了error或者completed事件,那么所有内部资源都会被释放。如果你需要提前释放这些资源或取消订阅的话,那么你可以手动调用Disposeabledispose方法,调用dispose方法后,订阅将被取消,并且内部资源都会被释放。通常情况下,你是不需要手动调用dispose方法的,除非明确知道这个资源我不再使用,这个场景下可以手动调用,取消订阅的几种方式如下:

方式一:直接调用dispose立即释放资源

observable1.subscribe { (value) in
    print(value)
} onError: { (err) in
    print(err is TestError)
} onCompleted: {
    print("completed")
} onDisposed: {
    print("onDisposed")
}.dispose()

方式二:利用DisposeBag,当bag销毁(deinit)的时候,会自动调用Disposeabledispose方法


observable1.subscribe { (value) in
    print(value)
} onError: { (err) in
    print(err is TestError)
} onCompleted: {
    print("completed")
} onDisposed: {
    print("onDisposed")
}.disposed(by: disposeBag)

方式三:利用take(until: rx.deallocated),当前的实例销毁(deinit)的时候,会自动调用Disposeabledispose方法

let _ = observable1.take(until: rx.deallocated).subscribe { (value) in
    print(value)
} onError: { (err) in
    print(err is TestError)
} onCompleted: {
    print("completed")
} onDisposed: {
    print("onDisposed")
}
相关文章
|
前端开发
前端学习笔记202307学习笔记第六十天-react源码-commit的第一个子阶段
前端学习笔记202307学习笔记第六十天-react源码-commit的第一个子阶段
42 0
|
前端开发
前端学习笔记202307学习笔记第六十天-react源码-commit的第一个子阶段3
前端学习笔记202307学习笔记第六十天-react源码-commit的第一个子阶段3
45 0
|
前端开发
前端学习笔记202307学习笔记第六十天-react源码-commit的第一个子阶段2
前端学习笔记202307学习笔记第六十天-react源码-commit的第一个子阶段2
39 0
|
10月前
|
消息中间件 定位技术 调度
《移动互联网技术》第八章 消息与服务:掌握不同类型广播监听方式,以及创建通知的方法
《移动互联网技术》第八章 消息与服务:掌握不同类型广播监听方式,以及创建通知的方法
28 0
|
11月前
[虚幻引擎插件介绍] DTGlobalEvent 蓝图全局事件, Actor, UMG 相互回调,自由回调通知事件函数,支持自定义参数。
本插件可以在虚幻的蓝图 Actor, Obiect,UMG 里面指定绑定和执行消息,可带自定义参数。 参数支持 Bool,Byte,Int,Int64,Float,Name,String,Text,Vector,Rotator,Transform,Object,Actor。
64 0
|
前端开发
前端学习笔记202307学习笔记第六十天-react源码-commit的第三个子阶段4
前端学习笔记202307学习笔记第六十天-react源码-commit的第三个子阶段4
41 0
|
前端开发
前端学习笔记202307学习笔记第六十天-react源码-commit的第三个子阶段3
前端学习笔记202307学习笔记第六十天-react源码-commit的第三个子阶段3
40 0
页面中有父子组件,生命周期顺序如何执行?(面试高频 一篇搞懂)
在实际开发中,一个页面经常会有父组件和子组件,那么在这个页面中,对于父子组件他们的生命周期又是如何执行的呢?看了一些网上的文章资料,竟然有些讲解写的是错误答案,带偏大家,所以在本文利用实践得出结论,带大家彻底搞懂这个知识点~
133 0
页面中有父子组件,生命周期顺序如何执行?(面试高频 一篇搞懂)
|
JavaScript 开发者
生命周期函数-组件创建期间的4个钩子函数|学习笔记
快速学习生命周期函数-组件创建期间的4个钩子函数
121 0
生命周期函数-组件创建期间的4个钩子函数|学习笔记
|
存储 XML 安全
线程与更新UI,细谈原理(上)
相信不少读者都阅读过相类似的文章了,但是我还是想完整的把这之间的关系梳理清楚,细节聊好,希望你也能从中学到一些。
214 0
线程与更新UI,细谈原理(上)