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,这个就是定时器的管理层。设计思路就是在模块中自建管理者,这个管理者和外部的总的管理者没有直接联系。
网友评论