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")
}
相关文章
|
1天前
|
前端开发 Java API
vertx学习总结5之回调函数及其限制,如网关/边缘服务示例所示未来和承诺——链接异步操作的简单模型响应式扩展——一个更强大的模型,特别适合组合异步事件流Kotlin协程
本文是Vert.x学习系列的第五部分,讨论了回调函数的限制、Future和Promise在异步操作中的应用、响应式扩展以及Kotlin协程,并通过示例代码展示了如何在Vert.x中使用这些异步编程模式。
10 5
vertx学习总结5之回调函数及其限制,如网关/边缘服务示例所示未来和承诺——链接异步操作的简单模型响应式扩展——一个更强大的模型,特别适合组合异步事件流Kotlin协程
|
4月前
|
存储 监控 Java
详尽分享统一对象消息编程(4)—对象消息编程框架1(基本接口)
详尽分享统一对象消息编程(4)—对象消息编程框架1(基本接口)
27 0
|
4月前
|
数据管理 Java
Spigot开发中的事件与监听器的关系
在Spigot插件开发中,监听器(Listener)是一个非常重要的概念。它们允许你捕捉和处理各种游戏事件,使你的插件能够对玩家的行为、游戏环境的变化等做出响应。本文将详细介绍监听器是什么、它们的用途,并通过一个代码示例展示如何使用监听器。
30 0
|
12月前
|
消息中间件 定位技术 调度
《移动互联网技术》第八章 消息与服务:掌握不同类型广播监听方式,以及创建通知的方法
《移动互联网技术》第八章 消息与服务:掌握不同类型广播监听方式,以及创建通知的方法
36 0
[虚幻引擎插件介绍] DTGlobalEvent 蓝图全局事件, Actor, UMG 相互回调,自由回调通知事件函数,支持自定义参数。
本插件可以在虚幻的蓝图 Actor, Obiect,UMG 里面指定绑定和执行消息,可带自定义参数。 参数支持 Bool,Byte,Int,Int64,Float,Name,String,Text,Vector,Rotator,Transform,Object,Actor。
81 0
|
安全 编译器 C#
C#基础知识学习之 ✨ 委托(delegate) 与 事件(event) 之间的介绍
委托(delegate) 与 事件(event) 🔥 前言🙏 在之前的文章里介绍了C#中的委托(delegate) (Action、Func、Predicate)的基本含义及用法 那本篇文章在这里还要介绍一个跟委托有很大关系的小伙伴——C#中的 事件(event)🎅 事件跟委托是有很大联系的,所以也就导致很容易分不清他们两个,以及什么时候用这两个 上面有博客提到委托,想单独了解委托的可以去看一下,本篇文章主要说一下 什么是事件 🎄 以及 事件与委托的区别🎁
C#基础知识学习之 ✨ 委托(delegate) 与 事件(event) 之间的介绍
页面中有父子组件,生命周期顺序如何执行?(面试高频 一篇搞懂)
在实际开发中,一个页面经常会有父组件和子组件,那么在这个页面中,对于父子组件他们的生命周期又是如何执行的呢?看了一些网上的文章资料,竟然有些讲解写的是错误答案,带偏大家,所以在本文利用实践得出结论,带大家彻底搞懂这个知识点~
143 0
页面中有父子组件,生命周期顺序如何执行?(面试高频 一篇搞懂)
|
存储
Mosquitto-1.5.4源码分析,主题订阅的数据结构及SUBSCRIBE的函数跳转关系
Mosquitto-1.5.4源码分析,主题订阅的数据结构及SUBSCRIBE的函数跳转关系
342 0
Mosquitto-1.5.4源码分析,主题订阅的数据结构及SUBSCRIBE的函数跳转关系
|
缓存
【EventBus】事件通信框架 ( 订阅类-订阅方法缓存集合 | 事件类型-订阅者集合 | 订阅对象-事件类型集合 )
【EventBus】事件通信框架 ( 订阅类-订阅方法缓存集合 | 事件类型-订阅者集合 | 订阅对象-事件类型集合 )
212 0
【EventBus】事件通信框架 ( 实现几个关键的封装类 | 消息中心 | 订阅注解 | 订阅方法封装 | 订阅对象-方法封装 | 线程模式 )
【EventBus】事件通信框架 ( 实现几个关键的封装类 | 消息中心 | 订阅注解 | 订阅方法封装 | 订阅对象-方法封装 | 线程模式 )
99 0