swift(3) RxSwift之定时器

上一篇文章,我们分析了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.interval方法时,Rx会直接帮我们创建好GCD计时器相关的代码。并根据参数执行OnNext闭包方法。

关于Rx计时器的停止,也很简单。可以直接调用error或者ompleted用于完成当前次订阅。也可以直接销毁该计时器:通过disposeBag()方法再次创建并赋值给全局变量disposeBag,从而释放掉之前的全局变量disposeBag,达到回收该次Observable对象的目的。

你可能感兴趣的:(swift(3) RxSwift之定时器)