RxSwift系列—RxSwift核心逻辑
2020/12/2 20:54:47
本文主要是介绍RxSwift系列—RxSwift核心逻辑,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
二、RxSwift核心逻辑
2.1 RxSwift使用三步曲
第一步:创建序列
let ob = Observable<String>.create { (observer) -> Disposable in return Disposables.create() }
第二步:订阅信号
let _ = ob.subscribe(onNext: { (text) in print("订阅信息: \(text)") }, onError: { (error) in print("error: \(error)") }, onCompleted: { print("订阅结束") }) { print("已销毁") }
第三步:发送信号
let ob = Observable<String>.create { (observer) -> Disposable in // 第三步:发送信号 obserber.onNext("你好明天") return Disposables.create() }
代码合并:
// 第一步: 创建序列 _ = Observable<String>.create { (obserber) -> Disposable in // 第三步: 发送信号 obserber.onNext("你好明天") return Disposables.create() // 这个销毁不影响我们这次的解读 // 第二步: 订阅序列 }.subscribe(onNext: { (text) in print("订阅到:\(text)") })
2.2 三步曲源码分析
分析代码:
- 1:创建序列的代码
Create
后面的闭包A
里面有第三步:发送信号
,如果要执行发送信号
,必然要来到这个闭包A
- 2:我们执行
第二步: 订阅序列
创建了闭包B
- 3:通过结果我们显然知道,先执行
闭包A
把你好明天
传给了闭包B
- 猜测:代码里面嵌套了闭包的执行调用!猜测的真实性,我们开始解读源码来验证
2.2.1 第一步:创建序列
使用Observable的create方法创建可观察序列
家可以很清晰看到我们的 可观察序列
的创建是利用协议拓展功能的create方法实现的,里面创建了一个 AnonymousObservable(匿名可观察序列)
命名还是体现了作者的思维 :这个类就是一个内部类,具备一些通用特性(具有自己功能的类才会命名) 下面我贴出这个类的继承关系:
从上面的图,我们可以清晰的看到的继承关系。这地方我们主要需要掌握一下几个方法:
create
方法,其返回值为AnonymousObservable(subscribe)。一个内部匿名可观察序列类。参数subscribe则为第一步创建序列中的闭包。AnonymousObservable
保存了外界的闭包AnonymousObservable
继承了Producer
具有非常重要的方法subscribe
实现很简单,init初始化时保存了传入的闭包,至此,第一步创建序列完成。
2.2.2 第二步:订阅信号
使用ObservableType的subscribe订阅信号
创建了一个 AnonymousObserver (匿名内部观察者)
手法和我们的 AnonymousObservable
差不多,它这里的初始化是闭包参数,保存了外界的 onNext, onError , onCompleted , onDisposed
的处理回调闭包的调用,函数结束时return一个Disposables对象,下面我还是给大家贴出 观察者
的继承链关系,帮助大家理解:
分析到现在,我们发现第一步的可观察序列有了,第二步的观察者也有了,但是他们之间似乎没有联系啊,怎么订阅的?以及第三步的发送信号又是如何执行的呢?
仔细查阅代码,我们就会发现,可观察序列
和 观察序列
关系是通过如下代码进行联系的!
我们先看看asObservable(),点击查看一下,fuck!点不进去。我们再点查看一下subscribe(observer),咦,好像也找不到实现。再往前看是self,self我们知道是第一步创建的可观察序列 Observable
!
在 Observable
,我们找到了asObservable()
和 subscribe
函数, asObservable()
的作用仅仅是返回自身self。
我们再看看subscribe
方法。 内部调用了rxAbstractMethod()
方法。但是经过查看,这个方法内部并没有被实现。Why?
我们再回想一下,Observable对象是由create
方法创建的。并且其内部是初始化了一个内部匿名可观察序列的实例对象。我们再回到Create文件查看一下源码。发现其也没有subscribe
函数。
通过观察AnonymousObservable的类继承图
,AnonymousObservable
类是继承至Producer
类,那subscribe
函数会不会是其父类Producer
的方法呢?
查看Producer
源码:
在下方找到run
函数。发现其内部只有一个rxAbstractMethod()
函数调用。真正的run
函数并没有实现。其实,这是一种设计模式。有好奇心的同学可以自行了解一下。这里就不展开叙述了。这个run
函数其实刚才我们已将看到过了,Producer
对象的子类AnonymousObservable
匿名可观察序列类里
-
sink.run
的写法也是比较好的,业务处理的还是下沉了,让分工更加明确 -
parent
就是上面传过来的AnonymousObservable
对象 -
我们非常兴奋的看到
AnonymousObservable._subscribeHandler
,从这句代码我们解惑了为什么我们的序列订阅
的时候流程会执行我们序列闭包
,然后去执行发送响应
-
发送响应的代码等会分析,这里还有一个比较重要的家伙
AnyObserver(self)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YuPvW2Mk-1606821507376)(./typora-user-images/image-20200110201816206.png)] -
在这个构造方法里面,我们创建了一个结构体
AnyObserver
保存了一个信息AnonymousObservableSink .on 函数
,不是AnonymousObservableSink
,这个地方一般初次来到这里的人都会犯错误。不知道你是否意识到了!
兄弟们,重点来了,敲黑板!!!
在这个方法中,传入了之前创建的匿名观察者AnonymousObserver实例对象。并且创建了一个AnonymousObservableSink
实例对象,并调用了它的run()
函数。我们看一下这个run()
函数的实现。其实是调用了parent._subscribeHandler(AnyObserver(self))
。parent
就是AnonymousObservable
的实例。也就是调用了AnonymousObservable._subscribeHandler(AnyObserver(self))
。
我们在分析第一步创建可观察序列的时候已经知道,这里的_subscribeHandler
保存的其实就是第一步创建可观察序列传入的闭包。现在调用_subscribeHandler
即是执行了这个闭包。而闭包中的方法就是第三步发送信号
。
经过上面的源码分析,已经知道了从创建可观察序列–>订阅信号–>发送信号这一系列的数据流转过程。
2.2.3 第三步:发送信号
我们从上面的分析,非常清晰:obserber.onNext(“你好明天”) 的本质是: AnyObserver.onNext(“你好明天”)
这时候发现我们的AnyObserver
是没有这个方法,这很正常!一般思路,找父类,找协议
- 外界
obserber.onNext("你好明天")
再次变形 :AnyObserver.on(.next("你好明天"))
,这里大家一定要主要,这个AnyObserver
调用了on
里面传的是.next函数
,.next函数
带有我们最终的参数 - self.observer
构造初始化就是:
AnonymousObservableSink .on 函数` - 看到这里又要变形咯:
self.observer(event)
->AnonymousObservableSink .on(event)
其中event = .next("明天你好")
最终我们的核心逻辑又回到了sink
这个神奇的管子,看到这里不禁拍案叫绝,RxSwift
这个设计能力,还有谁~~~ self.forwardOn(event)
这也是执行的核心代码,因为AnonymousObservableSink
继承Sink
这里还有封装,请看下面的代码
- 其中
self._observer
就是我们初始化保存的观察者:AnonymousObserver
- 那么我们变形得出本质就是:
AnonymousObserver.on(.next("明天你好"))
, 这里逻辑辗转回到了我们订阅序列
时候创建的AnonymousObserver
的参数闭包的调用!所有的一切感觉是这样的啰嗦,但又是这么的顺其自然。
- 判断event
进而调用onNext?(value)
,因为枚举的关联值(Swift
很强大的功能)value = "你好明天"
, 接下来就是外界onNext闭包的调用传参
,那么这个时候源码解析到这里,我相信你已经完全掌握了RxSwift
的核心逻辑
2.3 总结:RxSwift的结构
- 1:就是序列感念 满世界都是序列 - 编码统一 ,随时随地享用
- 2:通过函数式思想吧一些列的需求操作下沉(把开发者不关心的东西封装) - 优化代码,节省逻辑
- 3:
RxSwift
最典型的特色就是解决Swift
这门静态语言的响应能力,利用随时间维度序列变化为轴线,用户订阅关心能随轴线一直保活,达到订阅一次,响应一直持续~
这篇关于RxSwift系列—RxSwift核心逻辑的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-10-05Swift语法学习--基于协议进行网络请求
- 2022-08-17Apple开发_Swift语言地标注释
- 2022-07-24Swift 初见
- 2022-05-22SwiftUI App 支持多语种 All In One
- 2022-05-10SwiftUI 组件参数简写 All In One
- 2022-04-14SwiftUI 学习笔记
- 2022-02-23Swift 文件夹和文件操作
- 2022-02-17Swift中使用KVO
- 2022-02-08Swift 汇编 String array
- 2022-01-30SwiftUI3.0页面反向传值