这里将常用定时器实现方法做下记录,方便以后查找
第一种
根据屏幕刷新比率来实现的定时器
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封装成了一个序列,可操作性强
网友评论