RxSwift极简入门
关于RxSwift网上有多资料介绍,但部分来说很多都是关注于具体细节,以至于有一种看完有种似懂非懂的感觉。最近学习和使用了一段时间,这里写一下自己学习和使用的一些感受,不讨论具体的细节从整体上理解这个框架。
是什么
RxSwift根据中文文档介绍是一个用swift编写的函数式响应框架,这里有三个关键的点。
- swift编写的,这意味着学习这个框架是需要一点swift语言基础的,它主要服务于swift编写的项目环境。
- 函数式,是一个比较抽象的概念这里简单的可以理解为可以使用函数作为参数使用和传递。
- 响应式,同样可以简单的理解为一个事件发生就可以有对应的响应事件来接收和处理。
能做什么
知道了它是一个框架,那它具体能做些什么呢?主要用于解决什么问题呢?我们都知道框架是一般来说是为了提升开发效率而被创造出来的,RxSwift同样可以提升我们开发效率。
对于客户端程序我们主要解决的问题有两个处理用户交互和展示界面,其他的所有事情都是围绕这两个核心功能展开的。用户的交互也就是一系列的用户事件以及响应事件,通过RxSwift的基本介绍我们知道它的一个核心就是响应式的。页面展示主要体现为将一些数据可视化,以一种人性化的方式给用户使用。这涉及两个问题一数据加工处理,二页面元素于数据绑定。数据的加工处理也可以看作是一个事件,数据与页面元素的绑定可以看作是响应事件。数据加工处理的过程一般是不确定的,但是事件的传递和响应一般来说是个稳定的过程,通过函数式的思想将不确定的过程封装为函数传递到稳定的事件反馈中,就是一个不错的设计,这也是RxSwift的另一个核心。
一个简单的例子,我们想要设置一个文本的文字如text=“xxxxx”,一般来说当文本内容发生改变的时候我们需要再次设置如text=“yyyyyy”。这个过程实际上有些重复而繁琐,那是否可以优化一下提升效率呢?试想一下如果text与文字是绑定关系就好了,只要文字发生改变text上的文字也自动跟着改变,那我们将从页面元素和数据同步的逻辑中解放出来。RxSwift就是可以解决这种问题,以上问题我们可以把数据改变看作是一个事件,而页面元素和数据同步可以看作是一个响应。
RxSwift可以为我们创建一个类似于流水线的东西,我们可以通过函数作为参数传递进行数据处理、事件反馈。由于是流水线意味着我们只需定义一次即可重复使用,大大提升了开发效率以及将本来分散的逻辑集中到一条流水线上这样提升了易维护性。
什么结构和规格
知道了RxSwift是什么和能解决什么问题,我们一起来看看它是怎么解决这些问题的吧。先来看看它的整体架构,架构图如下
从图中可以看到它设计了这个几个规格的子模块生产事件、响应事件、生命周期、事件组合操作。还有一个核心图中没有体现那就是线程队列管理。
- Observable - 产生事件,为了接收事件RxSwift设计了一个叫可监听序列的概念,理解起来有些抽象。举个例子一个按钮的点击、一个文本的改变,我们需要可以知道它的状态发生改变了,这就需要它是可以监听的,Observable将抽象的这些可以发生变化的事件具体化为了一个对象,并且类似将它们存放在一个数组中,而每次事件发生变化时都可以触发回调。
- Observer - 响应事件,响应事件是为了处理产生事件而设计的,当触发生产事件回调时,可以对应的响应事件进行事件处理。
- Operator - 创建变化组合事件,有些复杂场景需要将多个事件共同作用的结果看作为一个新的事件,这时候就可以通过丰富的事件组合操作,将事件组合起来以满足千变万化的需求。
- Disposable - 管理绑定(订阅)的生命周期,RxSwif还提供了使用的生命周期管理,提升了使用的灵活性,让整个流程的得到有始有终的管理,不至于混乱。
- Schedulers - 线程队列调配,一些事件可能需要在主线程上处理,通过使用线程队列的使用调配也就能满足多线程的使用场景。
RxSwif通过设计了5个规格不同的子模块,实现了以事件监听及响应为核心的函数式响应框架,通过Observable将事件具体化、可监听化,通过Observer绑定或者订阅Observable的变化进行响应,使用Operator可以让各种事件完成组合。
每一个子模块又有各种对应特定场景的实现,具体使用的场景的可以参考开发手册进行学习使用,理解的框架的架构设计,使用上就是经验和熟练度的问题了,这需要时间和项目的积累了。
简单使用
使用上我觉主要牢记和理解两个概念产生事件、响应事件。这个两个概念的理解上我觉得主要在于如下几点。
- 生产事件,是怎么触发回调的。对于触发如何触发回调,不要执着于概念本身,只需要知道无论怎么样,要触发回调肯定是调用了回调函数,至于什么情况下触发那需要具体情况具体分析。那我们只需要知道调用回调函数的函数是什么就可以了,触发回调就是调用了回调函数。
- 响应事件,是怎样绑定的。对于绑定因为是使用的函数式的编程范式,可以理解为绑定就是回调函数的一个参数。
举个例子:
let disposeBag = DisposeBag()
let subject = ReplaySubject<String>.create(bufferSize: 0)
subject
.subscribe { print("Subscription: 1 Event:", $0) }
.disposed(by: disposeBag)
subject.onNext("