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")
}
相关文章
|
存储 JSON 网络安全
使用 EFS 在 AWS Lambda 上安装 Python 依赖项
使用 aws lambda 时,开发人员面临的常见挑战之一是管理大型 python 依赖项。
181 1
|
Python
Django 框架的路由系统
Django 框架的路由系统
326 63
|
9月前
|
机器学习/深度学习 安全 算法
布谷交友App源码开发新趋势:精准匹配与多元盈利模式解析
布谷交友App系统软件开发搭建需要紧跟市场趋势,把握用户需求,设计合理的盈利模式,并不断优化产品功能和用户体验,才能在激烈的市场竞争中脱颖而出,实现可持续发展。
|
数据库
分布式事务的四大特性和隔离级别
分布式事务是指在分布式系统中执行的涉及多个数据库或资源的事务。由于分布式环境中存在网络故障、节点故障等不可靠因素,因此需要采取一定的机制来保证分布式事务的一致性和可靠性。
754 0
|
前端开发 IDE 测试技术
自动化测试中的代码魔法:使用Python和Selenium框架
【8月更文挑战第31天】在软件开发的海洋中,自动化测试是一艘能够带领团队穿越波涛的帆船。本文将引导读者了解如何利用Python语言结合Selenium框架,编写简洁而强大的自动化测试脚本。我们将从搭建开发环境开始,逐步深入到实际案例,最后通过一个简单示例展示如何实现端到端的自动化测试流程。文章不仅提供实用的代码片段,还旨在激发读者对于软件测试深层次思考的热情。
|
JavaScript
vue + d3.js(v6) 绘制【树状图/思维导图】可折叠/展开,可点击跳转,可带标签
vue + d3.js(v6) 绘制【树状图/思维导图】可折叠/展开,可点击跳转,可带标签
1438 1
|
运维 关系型数据库 MySQL
MyCat-架构剖析-MyCat 主从切换实现 | 学习笔记
快速学习 MyCat-架构剖析-MyCat 主从切换实现
MyCat-架构剖析-MyCat 主从切换实现 | 学习笔记
|
弹性计算 固态存储 JavaScript
阿里云4核8G云服务器ECS有哪些?性能如何?4C8G性能参数表
阿里云4核8G ECS u1实例,适合30并发,日均1万IP访问。当前优惠价700元/年。配置包括Intel Xeon CPU,2.5 GHz,4核8G内存,1-3M带宽,20-40GB ESSD系统盘。网络性能可达50万PPS,最高25万连接数。可扩展公网带宽和云盘。适用于入门级企业应用。
771 0
|
人工智能 编解码 自然语言处理
prompt提示词
prompt提示词
1293 0
|
SQL 运维 监控
记一次对DM数据库的优化过程
记一次对DM数据库的优化过程
617 0

热门文章

最新文章