RxSwift核心流程简介
前言
RxSwift
是一个基于响应式
编程的Swift
框架,它提供了一种简洁而强大的方式来处理异步和事件驱动的编程任务。在RxSwift
中,核心流程包括观察者
、可观察序列
和订阅
。
RxSwift核心流程三部曲
// 1.创建序列
_ = Observable<String>.create { ob in
// 3.发送信号
ob.onNext("你好")
return Disposables.create()
// 2.订阅序列
}.subscribe(onNext: { text in
print("订阅到了\(text)")
})
}
- 1.创建序列
- 2.订阅序列
- 3.发送信号
上面三部曲的执行结果:
第一次玩RxSwift
比较好奇为什么会打印订阅到了你好
,明明是两个闭包
里面的代码。
我们先简单分析下:
- 序列创建
create
后面带了闭包A
,闭包A
里面执行了发送信号
的流程 - 订阅
subsribe
后面带了闭包B
- 根据结果我们知道一定是先执行了
闭包A
,再把闭包A
的你好
传给了闭包B
,然后输出结果
RxSwift核心逻辑分析
创建序列
点进create
函数可以看到它是拓展了ObservableType
这个协议,同时创建了一个AnonymousObservable
内部类(看名字是匿名序列
,具备一些通用的特性)分析AnonymousObservable
的继承链可以得到下面的关系图:
AnonymousObservable
AnonymousObservable
是接受Element
泛型的继承自Producer
的类,他接受并保存一个闭包subscribeHandler
的参数,这个其实就是上面我们说的闭包A
,另外有一个run
函数(后面会提到)
Producer
Producer
是接受Element
泛型的继承自Observable
的类,有一个subscribe
的实现,run
的抽象方法,这个subscribe
非常重要
Observable
Observable
是接受Element
泛型的实现ObservableType
协议的类,有一个subscribe
的抽象方法,asObservable
的实现(返回self
,统一万物皆序列)
同时Observable
有统计引用计数的能力(Resources
这个结构体在序列
,观察者
,销毁者
等都用到,可以调试是否有内存泄露),其中的AtomicInt
是一把NSLock
的锁,保证数据的存取安全
ObservableType
ObservableType
是拓展ObservableConvertibleType
协议的协议,定义了subscribe
协议方法,实现了asObservable()
方法,所以这里我们得出结论,不一定要继承Observable
的才是序列
,只要是实现了ObservableType
的subscribe
的协议方法的也可以算是序列
,进一步佐证万物接序列
ObservableConvertibleType
ObservableConvertibleType
是个协议,关联了Element
类型,定义asObservable
的协议方法
订阅序列
点击subscrib
e函数
它是ObservableType
的拓展能力,创建了一个AnonymousObserver
(匿名观察者)
,接受的Element
仔细查看继承链
代码会发现跟序列创建
的泛型是同一个
分析AnonymousObserver
的继承链我们可以得到下图:
AnonymousObserver
AnonymousObserver
是接受Element
泛型的继承自ObserverBase
的类
保存了一个eventHandler
的闭包,这个我们定义是闭包C
同时也有统计引用计数
的能力,有一个onCore
的实现
ObserverBase
ObserverBase
是接受Element
泛型的实现Disposable
和ObserverType
两个协议的类,有一个on
的实现,onCore
的抽象方法
ObserverType
ObserverType
关联了Element
,定义了on
的协议方法,拓展定义了onNext
,onCompleted
,onError
的方法,这三个方法其实都是on
一个Event
其中Event
是个枚举,有三类事件:next事件
、error事件
和completed事件
。
next事件
:next
事件携带了一个值,表示数据的更新或新的事件。error事件
:error
事件表示发生了一个错误,中断了事件的正常流程。completed事件
:completed
事件表示事件流的结束,不再有新的事件产生。 观察者通过订阅可观察序列来接收事件。
Disposable
Disposable
这个协议比较简单,定义了dispose
方法
订阅流程分析
1.调用
self.asObservable().subscribe(observer)
- 这个
self
是AnonymousObservable
的实例 - 调用
asObservable
方法通过继承链最终调用Observable
的实现,返回self
,也就还是AnonymousObservable
的实例
- 这个
2.调用
AnonymousObservable
的实例的subscribe
方法,通过继承链调用Producer
的subscribe
方法
- 3.
Producer
的run
方法在AnonymousObservable
有实现
- 3.
这个sink
的处理是相当不错的,很好的做到了业务下沉
,同时很好的运用了中间件
和单一职责
的设计模式,值得学习。
sink
是管道的意思,下水道
,什么东西都会往里面丢,这里面有订阅者
,销毁者
等
sink.run
parent.subscribeHandler(AnyObserver(self))
这里的parent
就是AnonymousObservable
的实例,调用subscribeHandler
这个也就是我们定义的闭包A
这里解释了订阅的时候会来到我们的闭包A
的原因。 这里需要注意到AnyObserver
这个类,他里面保存的observer
属性其实是AnonymousObservableSink.on
函数
发送信号
有了上两步的基础我们分析发送信号的流程应该比较清晰了
obserber.onNext
其实就是AnyObserver.onNext
ObserverType.onNext
其实就是ObserverType.on
- 其实就是
AnyObserver.on
- 其实就是
- 4.这个
observer
就是上面第二步最后的AnonymousObservableSink.on
函数
- 4.这个
- 5.父类
Sink.forwardOn
函数 这里的self.observer
类型是AnonymousObserver
- 5.父类
- 6.调用
AnonymousObserver
的父类ObserverBase
的on
方法
- 6.调用
- 7.调用
AnonymousObserver
的onCore
方法
- 7.调用
- 8.调用
eventHandler
,也就是我们定义的闭包C
- 9.
闭包C
根据Event
调用闭包B
,闭包B
输出了控制台的结果,至此,整个链路执行完毕了。
- 8.调用
把整个核心流程用思维导图
描述出来:
总结
万物皆序列
,序列的概念统一了编码- 完整的继承链做到了
业务分离
,单一职责
中间价
模式很好的做到了业务下沉
链接:https://juejin.cn/post/7233980221107748921
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。