1、在global线程里创建一个时间源
// 在global线程里创建一个时间源
let codeTimer = DispatchSource.makeTimerSource(queue: DispatchQueue.global())
2、开始Dispatch Timer
// Dispatch Timer
fileprivate func startGCDTimer() {
// 设定这个时间源是每秒循环一次,立即开始
codeTimer.schedule(deadline: .now(), repeating: .seconds(1))
// 设定时间源的触发事件
codeTimer.setEventHandler(handler: {
// 返回主线程处理一些事件,更新UI等等
DispatchQueue.main.async {
self.timerMethod()
}
})
// 判断是否取消,如果已经取消了,调用resume()方法时就会崩溃!!!
if codeTimer.isCancelled {
return
}
// 启动时间源
codeTimer.resume()
}
3、时分秒之间的转化
@objc fileprivate func timerMethod() {
// 秒
if sec >= 59 {
sec = 0
// 分钟
if min >= 59 {
min = 0
// 时
hour = hour + 1
}else {
min = min + 1
}
// print("*****秒:\(sec), 分:\(min)")
}else {
sec = sec + 1
// print("时:\(hour), 分:\(min), 秒:\(sec)")
}
print("时:\(hour), 分:\(min), 秒:\(sec)")
textView.text = String(format: "%02d", hour) + "-" + String(format: "%02d", min) + "-" + String(format: "%02d", sec)
}
调用如下:
开始
@IBAction func clickedStartButton(_ sender: UIButton) {
startGCDTimer() // 开始
}
暂停
注:暂停之后,再点击开始,是接着上次暂停进行的开始计时!!!
@IBAction func clickedStopButton(_ sender: UIButton) {
codeTimer.suspend() // 暂停
}
取消
取消后,再次点击开始也是没有计时的,因为取消代表的是结束计时,而不是暂停!!!
@IBAction func clickedCancleButton(_ sender: UIButton) {
codeTimer.cancel() // 取消
}
网友评论