美文网首页swift学习
RxSwift3.0定时器的补充

RxSwift3.0定时器的补充

作者: 数字d | 来源:发表于2019-08-15 17:32 被阅读0次

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

    第一种

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

        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

    相关文章

      网友评论

        本文标题:RxSwift3.0定时器的补充

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