上一篇文章,我们分析了RxSwift的核心原理。这篇文章我们看一下核心原理在RxSwift定时器上的应用。
关于定时器的实现。OC里我们已经知道有多种,常用的有NSTimer,和GCD的封装,如YYTimer。而在Swift里,NStimer和OC里原理与功能一样。尤其在与滑动联动的时候,也需要加入runloop的Common模式。
GCD实现定时器的优点在于不受runloop影响,而且更加准确。
本文先介绍Swift里GCD如何实现定时器,而后着重于RxSwift里的定时器是如何封装的。
一:普通GCD的实现定时器
直接上代码。这没啥可讲的,跟OC里用GCD实现计时器原理上没什么差别。
二:RxSwift定时器的实现。
能够看出,代码也比较简单。我们接下来着重于代码的封装。
1.interval的实现。我们点进去查看interval,经过两次跳转,我们来到了实现部分,如下
咦?有没有一种感觉,这个代码我好想在哪见过?对,上一篇文章里,我们研究Observable的时候,有一个AnonymousObservable类。我们能发现:
①他们同样是继承于Producer。②同样是保存了创建时传进来的数据。③同样是父类触发的run方法。④同样是创建了sink类并调用sink类的run方法。他们唯一的区别就在于Timer与AnonymousObservable分工不同。体现了谁的事情谁做的设计原则。
如果上一篇文章中的流程依然了然于胸,那么看到这,其实对于后面的逻辑应该已经有了些猜测了。
2.我们继续点进去查看这个TimerSink。
我们看到,这个红框内是3个参数外加一个尾随闭包,同时我们发现了一段非常熟悉的代码
self.forwardOn(.next(state))
在上篇文章中,我们就知道,只要调用这个self.forwardOn(.next(state))方法,subscribe就会执行相应的闭包,见下图(来自底层原理探究一文的部分节选)
3.现在关键就在于这个尾随闭包谁在调用。我们继续点进去查看
4.整体实现方式,跟我们在文章开头自己实现的GCD计时器一模一样。我们关键找到了这个尾随闭包的实现。
到此。RxSwift的GCD实现的定时器就很清晰了:
当我们执行Observable<Int>.interval方法时,Rx会直接帮我们创建好GCD计时器相关的代码。并根据参数执行OnNext闭包方法。
关于Rx计时器的停止,也很简单。可以直接调用error或者ompleted用于完成当前次订阅。也可以直接销毁该计时器:通过disposeBag()方法再次创建并赋值给全局变量disposeBag,从而释放掉之前的全局变量disposeBag,达到回收该次Observable对象的目的。