注册
iOS

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.发送信号

上面三部曲的执行结果:


91cd9ffd5b14c5a332b24afc608132fc.png

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

  • 序列创建create后面带了闭包A闭包A里面执行了发送信号的流程
  • 订阅subsribe后面带了闭包B
  • 根据结果我们知道一定是先执行了闭包A,再把闭包A你好传给了闭包B,然后输出结果

RxSwift核心逻辑分析


创建序列


f06346efb2458e77708be9dda7e734e4.png


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


d2261b38dcec6468e16cb01d26e83006.png


AnonymousObservable


42d325c21d302cb978198fbce5f0161c.png

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


Producer


15494729925c9c8c594060302425052b.png

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


Observable


350503fffef69010c9f525d5689f5e35.png

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


086280076e28c1c7147a38e95f241936.png


ObservableType


326c81dce1946f577787595198fbb517.png


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


ObservableConvertibleType


d386f379d1e27ae0ba0313959bf9e3e9.png


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


订阅序列


点击subscribe函数


445b0509436c49cd74dce93f75879b6d.png


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


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


b8df0e88532d64d3f912a32f13b51365.png


AnonymousObserver


d50700e305ca4a05ffc75c3788b9614a.png

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


ObserverBase


bd183c919d68b6462deb91c07ca0612f.png


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


ObserverType


68a6be14c969191ee38608d927a7264f.png


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


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

  • next事件next事件携带了一个值,表示数据的更新或新的事件。
  • error事件error事件表示发生了一个错误,中断了事件的正常流程。
  • completed事件completed事件表示事件流的结束,不再有新的事件产生。 观察者通过订阅可观察序列来接收事件。

Disposable


a5d42f7a33f4344dcefeb0e687bae13f.png


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


订阅流程分析

  • 1.调用self.asObservable().subscribe(observer)

    • 这个selfAnonymousObservable的实例
    • 调用asObservable方法通过继承链最终调用Observable的实现,返回self,也就还是AnonymousObservable的实例
  • 2.调用AnonymousObservable的实例的subscribe方法,通过继承链调用Producersubscribe方法

f24ba7b41a27eb7b6a926bda5a534fc3.png
    • 3.Producerrun方法在AnonymousObservable有实现
9642d44a30fb9504ecbfa23d960df0dc.png

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

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

    1. sink.run
    1. parent.subscribeHandler(AnyObserver(self))这里的parent就是AnonymousObservable的实例,调用subscribeHandler这个也就是我们定义的闭包A 这里解释了订阅的时候会来到我们的闭包A的原因。 这里需要注意到AnyObserver这个类,他里面保存的observer属性其实是AnonymousObservableSink.on函数

发送信号


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

    1. obserber.onNext 其实就是AnyObserver.onNext
    1. ObserverType.onNext其实就是ObserverType.on
    1. 其实就是AnyObserver.on
01098eaa91e6b0f1b6d5ab72d9292c6f.png
    • 4.这个observer就是上面第二步最后的AnonymousObservableSink.on函数
4ed591a54c45aa596111c0862ec350ff.png
    • 5.父类Sink.forwardOn函数 这里的self.observer类型是 AnonymousObserver
1666b52212c49378e76263a07a8557ce.png
    • 6.调用AnonymousObserver的父类ObserverBaseon方法
d749a81576aee224dae9f1dd51d75ea3.png
    • 7.调用AnonymousObserveronCore方法
d5f0d86678eaae6d7fd7ac67586c4ad6.png
    • 8.调用eventHandler,也就是我们定义的闭包C
    • 9.闭包C根据Event调用闭包B闭包B输出了控制台的结果,至此,整个链路执行完毕了。


c1cebc4a0c709cadd765d086866b9d56.png


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


9be49a32871661c1f70ba2a2e1e2ab6e.png


总结

  • 万物皆序列,序列的概念统一了编码
  • 完整的继承链做到了业务分离单一职责
  • 中间价模式很好的做到了业务下沉

作者:大帅哥哦
链接:https://juejin.cn/post/7233980221107748921
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

0 个评论

要回复文章请先登录注册