1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | mport 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" ) } } /// GCD定时器相关方法 extension ZDTimerTool{ /// 初始化得到GCD定时器 func DispatchTimer(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() } } self.GCDTimer?.resume() self.GCDTimer?.schedule(deadline: DispatchTime.now(), repeating: timeInterval) } else { self.stopOrResumeGCDTimer(isStop: false ) } } /// 暂停或者重启GCDTimer func stopOrResumeGCDTimer(isStop: Bool){ guard self.isSuspend != isStop else { return } 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 } } |
2.使用
1 2 | //倒计时 var countdownTimer = ZDTimerTool() |
1 2 3 4 | 适当地方开启定时器 countdownTimer.DispatchTimer(timeInterval: 1) { [weak self] in self?.handTimer() } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | func handTimer() { if self.remainingSeconds == 0{ self.remainingSeconds = 60 self.sendButton.setTitle( "重新发送" , for : .normal) self.sendButton.backgroundColor = UIColor.init(hexColor: "FF8E00" ) self.sendButton.isEnabled = true self.countdownTimer.stopOrResumeGCDTimer(isStop: true ) } else { sendButton.setTitle( "\(remainingSeconds)秒后重新获取" , for : .normal) self.sendButton.backgroundColor = UIColor.gray sendButton.isEnabled = false } self.remainingSeconds -= 1 } |
分类:
swift
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现