Timer
需要注意,Timer需要加入RunLoop才会开启,并且设置RunLoop.Mode = .common才不会受UI事件影响,但是加入到.common有可能会出现一些问题,比如NSTimer的触发时间到的时候,runloop如果在阻塞状态,触发时间就会推迟到下一个runloop周期,所以NSTimer的精确度低了点。
GCD
我一般使用GCD来计时,因为精准度较高。
CADisplayLink
不是很常用,CADisplayLink是一个定时器对象,它可以让你与屏幕刷新频率相同的速率来刷新你的视图。就说CADisplayLink是用于同步屏幕刷新频率的计时器。
同样需要添加到runloop,不然不会被触发
//MARK: - 计时器的实现种类
func testTimer(){
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)
})
}
// 精确 - GCD 封装timer
// 封装了一套GCD PRODUCER 环境
func testGCD(){
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
}
func textCAD() {
cadTimer = CADisplayLink(target: self, selector: #selector(timerFire))
cadTimer?.preferredFramesPerSecond = 1
cadTimer?.add(to: RunLoop.current, forMode: .default)
// cadTimer?.isPaused = true
}
网友评论