美文网首页
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