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")
}
相关文章
|
2月前
|
前端开发 Java API
vertx学习总结5之回调函数及其限制,如网关/边缘服务示例所示未来和承诺——链接异步操作的简单模型响应式扩展——一个更强大的模型,特别适合组合异步事件流Kotlin协程
本文是Vert.x学习系列的第五部分,讨论了回调函数的限制、Future和Promise在异步操作中的应用、响应式扩展以及Kotlin协程,并通过示例代码展示了如何在Vert.x中使用这些异步编程模式。
54 5
vertx学习总结5之回调函数及其限制,如网关/边缘服务示例所示未来和承诺——链接异步操作的简单模型响应式扩展——一个更强大的模型,特别适合组合异步事件流Kotlin协程
|
2月前
|
缓存 小程序 UED
如何利用小程序的生命周期函数实现数据的加载和更新?
如何利用小程序的生命周期函数实现数据的加载和更新?
80 4
|
并行计算 安全 Java
【JavaSE专栏80】多线程通信,多个线程之间如何实现信息传递和同步?
【JavaSE专栏80】多线程通信,多个线程之间如何实现信息传递和同步?
136 0
|
7月前
LabVIEW使用多个事件结构来处理同一个事件
LabVIEW使用多个事件结构来处理同一个事件
228 0
|
安全 编译器 C#
C#基础知识学习之 ✨ 委托(delegate) 与 事件(event) 之间的介绍
委托(delegate) 与 事件(event) 🔥 前言🙏 在之前的文章里介绍了C#中的委托(delegate) (Action、Func、Predicate)的基本含义及用法 那本篇文章在这里还要介绍一个跟委托有很大关系的小伙伴——C#中的 事件(event)🎅 事件跟委托是有很大联系的,所以也就导致很容易分不清他们两个,以及什么时候用这两个 上面有博客提到委托,想单独了解委托的可以去看一下,本篇文章主要说一下 什么是事件 🎄 以及 事件与委托的区别🎁
C#基础知识学习之 ✨ 委托(delegate) 与 事件(event) 之间的介绍
[虚幻引擎插件介绍] DTGlobalEvent 蓝图全局事件, Actor, UMG 相互回调,自由回调通知事件函数,支持自定义参数。
本插件可以在虚幻的蓝图 Actor, Obiect,UMG 里面指定绑定和执行消息,可带自定义参数。 参数支持 Bool,Byte,Int,Int64,Float,Name,String,Text,Vector,Rotator,Transform,Object,Actor。
96 0
【函数栈帧的创建和销毁】 -- 神仙级别底层原理,你学会了吗?(2)
1.函数的调用方式 相信你对调用函数一点都不陌生,但是在调用函数的过程中,却存在着很多你无法见到的东西,这是底层信息,想要理解透彻,就得深入底层去观察。 本文以一个最简单的加法函数为例,深入讲解内存空间中的每一条指令。
【函数栈帧的创建和销毁】 -- 神仙级别底层原理,你学会了吗?(1)
1.函数的调用方式 相信你对调用函数一点都不陌生,但是在调用函数的过程中,却存在着很多你无法见到的东西,这是底层信息,想要理解透彻,就得深入底层去观察。 本文以一个最简单的加法函数为例,深入讲解内存空间中的每一条指令。
第十二章队列模拟注意事项
第十二章队列模拟注意事项
60 0
线程与更新UI,细谈原理(下)
相信不少读者都阅读过相类似的文章了,但是我还是想完整的把这之间的关系梳理清楚,细节聊好,希望你也能从中学到一些。
144 0
线程与更新UI,细谈原理(下)