RxSwift之Timer

首先,我們先來看看Swift中創(chuàng)建Timer的幾種方式

1.Timer的方式

  • target action
timer = Timer.init(timeInterval: 1, target: self, selector: #selector(timerFire), userInfo: nil, repeats: true) RunLoop.current.add(timer, forMode: .common)


@objc func timerFire() {
   print("走你")
}

這種方式在設(shè)置當(dāng)前runloopcommonMode模式時(shí)可以防止scrollView頁(yè)面滑動(dòng)Timer的停滯

  • scheduledTimer block
timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true,               block: { (timer) in
       print(timer)
 })

這種操作默認(rèn)把timer加入到當(dāng)前runloop的default模式下
2.GCD方式的Timer

var gcdTimer: DispatchSourceTimer?
...
gcdTimer = DispatchSource.makeTimerSource()
gcdTimer?.schedule(deadline: DispatchTime.now(), repeating: DispatchTimeInterval.seconds(1))
gcdTimer?.setEventHandler(handler: {
            print("走你GCD")
    })
gcdTimer?.resume()

不受線程runloop的影響。它會(huì)在自己所在的線程中一直執(zhí)行下去,直到被suspend或者cancel
3.CADisplayLink方式的Timer

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

4.RxSwiftTimer

 var timer: Observable<Int>!
...
timer = Observable<Int>.interval(RxTimeInterval.seconds(1), scheduler: MainScheduler.instance)
        timer.subscribe(onNext: { (num) in
            print(num)
        })
        .disposed(by: disposeBag)

不受線程runloop的影響

RxSwift的Timer源碼分析

interval源碼我們首先來到

public static func interval(_ period: RxTimeInterval, scheduler: SchedulerType)
        -> Observable<Element> {
        return Timer(
            dueTime: period,
            period: period,
            scheduler: scheduler
        )
    }

periodTimeInterval類型,表示執(zhí)行每一次的時(shí)間周期
scheduler是調(diào)度者
來到Timer源碼

final private class Timer<Element: RxAbstractInteger>: Producer<Element> {
    fileprivate let _scheduler: SchedulerType
    fileprivate let _dueTime: RxTimeInterval
    fileprivate let _period: RxTimeInterval?

    init(dueTime: RxTimeInterval, period: RxTimeInterval?, scheduler: SchedulerType) {
        self._scheduler = scheduler
        self._dueTime = dueTime
        self._period = period
    }

    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {
        if self._period != nil {
            let sink = TimerSink(parent: self, observer: observer, cancel: cancel)
            let subscription = sink.run()
            return (sink: sink, subscription: subscription)
        }
        else {
            let sink = TimerOneOffSink(parent: self, observer: observer, cancel: cancel)
            let subscription = sink.run()
            return (sink: sink, subscription: subscription)
        }
    }
}

Timer初始化中保存_scheduler,_dueTime,_period,并重寫了run方法,內(nèi)部使用TimerSink調(diào)用run方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容