Swift:使用GCD实现计时器

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() // 取消
    }

你可能感兴趣的:(Swift:使用GCD实现计时器)