返回

RxSwift

2023-05-17 by shenpeng

前言

RxSwift是一个基于响应式编程的Swift框架,它提供了一种简洁而强大的方式来处理异步和事件驱动的编程任务。在RxSwift中,核心流程包括观察者可观察序列订阅

RxSwift核心流程三部曲

1
2
3
4
5
6
7
8
9
10
 // 1.创建序列
_ = Observable<String>.create { ob in
// 3.发送信号
ob.onNext("你好")
return Disposables.create()
// 2.订阅序列
}.subscribe(onNext: { text in
print("订阅到了\(text)")
})
}

上面三部曲的执行结果:

image.png
第一次玩RxSwift比较好奇为什么会打印订阅到了你好,明明是两个闭包里面的代码。
我们先简单分析下:

RxSwift核心逻辑分析

创建序列

image.png

点进create函数可以看到它是拓展了ObservableType这个协议,同时创建了一个AnonymousObservable内部类(看名字是匿名序列,具备一些通用的特性)分析AnonymousObservable的继承链可以得到下面的关系图:

image.png

AnonymousObservable

image.png
AnonymousObservable是接受Element泛型的继承自Producer的类,他接受并保存一个闭包subscribeHandler的参数,这个其实就是上面我们说的闭包A,另外有一个run函数(后面会提到)

Producer

image.png
Producer是接受Element泛型的继承自Observable的类,有一个subscribe的实现,run的抽象方法,这个subscribe非常重要

Observable

image.png
Observable是接受Element泛型的实现ObservableType协议的类,有一个subscribe的抽象方法,asObservable的实现(返回self,统一万物皆序列)
同时Observable有统计引用计数的能力(Resources这个结构体在序列观察者销毁者等都用到,可以调试是否有内存泄露),其中的AtomicInt是一把NSLock的锁,保证数据的存取安全

image.png

ObservableType

image.png

ObservableType是拓展ObservableConvertibleType协议的协议,定义了subscribe协议方法,实现了asObservable()方法,所以这里我们得出结论,不一定要继承Observable的才是序列,只要是实现了ObservableTypesubscribe的协议方法的也可以算是序列,进一步佐证万物接序列

ObservableConvertibleType

image.png

ObservableConvertibleType是个协议,关联了Element类型,定义asObservable的协议方法

订阅序列

点击subscribe函数

image.png

它是ObservableType的拓展能力,创建了一个AnonymousObserver(匿名观察者)
,接受的Element仔细查看继承链代码会发现跟序列创建的泛型是同一个

分析AnonymousObserver的继承链我们可以得到下图:

image.png

AnonymousObserver

image.png
AnonymousObserver是接受Element泛型的继承自ObserverBase的类
保存了一个eventHandler的闭包,这个我们定义是闭包C
同时也有统计引用计数的能力,有一个onCore的实现

ObserverBase

image.png

ObserverBase是接受Element泛型的实现DisposableObserverType两个协议的类,有一个on的实现,onCore的抽象方法

ObserverType

image.png

ObserverType关联了Element,定义了on的协议方法,拓展定义了onNextonCompletedonError的方法,这三个方法其实都是on一个Event

其中Event是个枚举,有三类事件:next事件error事件completed事件

Disposable

image.png

Disposable这个协议比较简单,定义了dispose方法

订阅流程分析

image.png

image.png
这个sink的处理是相当不错的,很好的做到了业务下沉,同时很好的运用了中间件单一职责的设计模式,值得学习。

sink是管道的意思,下水道,什么东西都会往里面丢,这里面有订阅者销毁者

发送信号

有了上两步的基础我们分析发送信号的流程应该比较清晰了

image.png

image.png

image.png
这里的self.observer类型是 AnonymousObserver

image.png

image.png

image.png

把整个核心流程用思维导图描述出来:

image.png

总结