swift - 封装 GCDTimer 和 NSTimer

Posted qingzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift - 封装 GCDTimer 和 NSTimer相关的知识,希望对你有一定的参考价值。




封装的类代码

import UIKit

/// 控制定时器的类
class ZDTimerTool: NSObject {
    /// 定时器
//    private var timer: Timer?
    /// GCD定时器
    private var GCDTimer: DispatchSourceTimer?
    /// GCD定时器的挂起状态
    private var isSuspend: Bool = false
    override init() {
        super.init()
    }
    deinit {
        // 对象在销毁前会销毁定时器,所以使用定时器应该设置全局的属性
//        self.invaliTimer()
        self.invaliGCDTimer()
        DDLOG(message: "deinit: ZDTimerTool")
    }
//    /// 设置定时器
//    func initilAndStartTimer(timeInterval: TimeInterval,handleBlock:@escaping (() -> Void)) {
//        self.timer = Timer.scheduledTimer(withTimeInterval: timeInterval, repeats: true, block: { t in
//            handleBlock()
//        })
//    }
//    /// 暂停或者重启定时器定时器
//    func stopOrStartTimer(isStop: Bool) {
//        self.timer?.fireDate = isStop == true ? Date.distantFuture : Date.distantPast
//    }
//    /// 销毁定时器
//    func invaliTimer() {
//        self.timer?.invalidate()
//        self.timer = nil
//    }
}
/// GCD定时器相关方法
extension ZDTimerTool{
    /// 初始化得到GCD定时器
    func DispatchTimer(delayTime: Double = 0 , timeInterval: TimeInterval , handleBlock:@escaping (() -> Void)) {
        if self.GCDTimer == nil {
            self.GCDTimer = DispatchSource.makeTimerSource(flags: [], queue: DispatchQueue.main)
            self.GCDTimer?.schedule(deadline: DispatchTime.now(), repeating: timeInterval)
            self.GCDTimer?.setEventHandler{
                DispatchQueue.main.async {
                    handleBlock()
                }
            }
        }else{
            self.GCDTimer?.setEventHandler{
                DispatchQueue.main.async {
                    handleBlock()
                }
            }
        }
        self.GCDTimer?.schedule(deadline: DispatchTime.now(), repeating: timeInterval)
        //        self.GCDTimer?.schedule(wallDeadline: DispatchWallTime.now(), repeating: timeInterval)
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delayTime) { [weak self] in
            self?.GCDTimer?.resume()
        }
        
    }
    /// 暂停或者重启GCDTimer
    func stopOrResumeGCDTimer(isStop: Bool){
        isStop == true ? self.GCDTimer?.suspend() : self.GCDTimer?.resume()
        self.isSuspend = isStop
    }
    /// 销毁GCD定时器
    func invaliGCDTimer() {
        if self.isSuspend == true {
            self.GCDTimer?.resume()
        }
        self.GCDTimer?.cancel() //销毁前不能为suspend(挂起状态)
        self.GCDTimer = nil
    }
}


使用方法:

属性 timer 和时间
    //倒计时
    var countdownTimer = ZDTimerTool()

    // remainingSeconds代表当前倒计时剩余的秒数
    var remainingSeconds: Int = 60


//在需要的地方开启倒计时 countdownTimer.DispatchTimer(timeInterval:
1) { [weak self] in self?.handTimer() } func handTimer() { self.remainingSeconds -= 1 if self.remainingSeconds == 0{//倒计时0秒 self.remainingSeconds = 60 self.sendButton.setTitle("重新发送", for: .normal) self.sendButton.backgroundColor = UIColor.red self.sendButton.isEnabled = true self.countdownTimer.stopOrResumeGCDTimer(isStop: true) }else{ sendButton.setTitle("(remainingSeconds)秒后重新获取", for: .normal) self.sendButton.backgroundColor = UIColor.gray sendButton.isEnabled = false } }

 






以上是关于swift - 封装 GCDTimer 和 NSTimer的主要内容,如果未能解决你的问题,请参考以下文章

知识蒸馏NST算法实战:使用CoatNet蒸馏ResNet18

知识蒸馏NST算法实战:使用CoatNet蒸馏ResNet18

为啥 我打开cso nst增强普及版 出现错误 错误信息 无法找打指定DLL库文件skinh_el.dll中的输入命令skinh

我想在swift或objective-c中包含BluetoothManager框架,有问题

SQLite.swift —— 纯 Swift 封装的 SQLite 框架

instant是啥意思