1.初始化定时器
timer = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
2.暂停,开启定时器
timer?.fireDate = Date.distantFuture // 暂停
timer?.fireDate = Date.init(timeIntervalSinceNow: 3.0) //3秒后开启
3.停止定时器
timer?.invalidate()
4.在滑动页面上的列表时,timer会暂停的原因,以及解决办法
- 原因
在滑动时 当前线程的runloop切换了mode用于列表滑动,导致timer暂停;runloop中的mode主要用来指定事件在runloop中的优先级,默认是default;
- 解决
-
方法一:
将timer加入到runloop的commonModes中,
RunLoop.current.add(timer!, forMode: .commonModes)
-
方法二:
将timer放在另外一个线程中,然后开启另外一个线程的runloop,这样可以保证与主线程互不干扰,
DispatchQueue.global().async { self.timer = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(self.timerAction), userInfo: nil, repeats: true) RunLoop.current.run() }
-
网友评论