swift学习

RxSwift3.0定时器的补充

2019-08-15  本文已影响0人  数字d

这里将常用定时器实现方法做下记录,方便以后查找

第一种

根据屏幕刷新比率来实现的定时器

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

    @objc func timerFire(){
        print("log info ")
    }

受到用户UI操作影响,如果滑动控件,定时器会停止打印数据

第二种

常规定时器,forMode常用值从default改为.common

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

不受用户UI操作影响,如果滑动控件,定时器不会停止打印数据

这里将定时器事物加到common中,不易管理,性能较差

第三种

类似于第二种定时器,填入的是default,但是用的代码块{}形式

    var timer = Timer()

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

这里因为用的是defalut模式,所以拖动UI是会受到影响的

受到用户UI操作影响,如果滑动控件,定时器会停止打印数据

第四种

gcd的定时器实现

      var gcdTimer: DispatchSourceTimer?
        gcdTimer = DispatchSource.makeTimerSource()
        gcdTimer?.schedule(deadline: DispatchTime.now(), repeating: DispatchTimeInterval.seconds(1))
        gcdTimer?.setEventHandler(handler: {
//            self.timerFire()
            print("log info ")

        })
        gcdTimer?.resume()
//        gcdTimer?.suspend()
//        gcdTimer?.cancel()
//        gcdTimer = nil

不受用户UI操作影响,如果滑动控件,定时器不会停止打印数据

第五种

rx 定时器,是对gcd定时器的封装

   var rxtimer: Observable<Int>!
   rxtimer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
        rxtimer.subscribe(onNext: { (num) in
            print(num)
 //   销毁
//            a += 1
//            if a > 5
//            {
//              disposeBag = DisposeBag()
//            }
        })
        .disposed(by: disposeBag)

不受用户UI操作影响,如果滑动控件,定时器不会停止打印数据

这里将GCD封装成了一个序列,可操作性强

代码实现:https://gitee.com/xgkp/RX3_0.git

上一篇下一篇

猜你喜欢

热点阅读