美文网首页
RxSwift中为什么timer不受runloop影响?

RxSwift中为什么timer不受runloop影响?

作者: Emma_虫儿 | 来源:发表于2019-08-17 23:59 被阅读0次

RxSwift中为什么timer不受runloop影响?

你好,我是Emma,今天我们来研究RxSwift中的timer。

1.一般创建timer如何创建的?

定时器创建-》执行。这两个过程很容易想到但是,运行结果呢?

timer = Timer.init(timeInterval: 1, target: self, selector: #selector(timerFire), userInfo: nil, repeats: true)
timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { (timer) in
    print(timer)
})

fire一次之后为什么就不再fire了?
原因是timer环境依赖于runloop.

timer = Timer.init(timeInterval: 1, target: self, selector: #selector(timerFire), userInfo: nil, repeats: true)
RunLoop.current.add(timer, forMode: .common)
timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { (timer) in
    print(timer)
})

这样就可以一直执行且不受主线程影响了。

Rxswift中的定时器是一直执行的,不受界面滑动的影响,这点是怎么做到的?

思考方法:猜测

1.Timer加载 Mode中用的是common,缺点就是常驻线程。

2.关于GCD的timer,这种定时器比较精确。
验证:

gcdTimer = DispatchSource.makeTimerSource()
gcdTimer?.schedule(deadline: DispatchTime.now(), repeating: DispatchTimeInterval.seconds(1))
gcdTimer?.setEventHandler(handler: {
    print("hello GCD")
})
gcdTimer?.resume()
gcdTimer?.suspend()
gcdTimer?.cancel()
gcdTimer = nil

Tips:默认是挂起状态一定要 resume,平时挂起的话一定要先cancle然后再制空。这个是为什么?
commond+shift+0查看文档

3.CADtimer

cadTimer = CADisplayLink(target: self, selector: #selector(timerFire))
cadTimer?.preferredFramesPerSecond = 1
cadTimer?.add(to: RunLoop.current, forMode: .default)

RXSwift到底中的是哪种呢?
结果是RxSwift中Timer中自己封装的GCD。任何继承于produce的类都是来到了run,创建了一个TimerSink,这个就是定时器的管理层。设计思路就是在模块中自建管理者,这个管理者和外部的总的管理者没有直接联系。

相关文章

网友评论

      本文标题:RxSwift中为什么timer不受runloop影响?

      本文链接:https://www.haomeiwen.com/subject/bculsctx.html