• [Swift]定义一个全局的可管理的计时器


    定义一个全局计时器,延迟执行操作。可以对计时器进行全局控制,能手动控制暂停/重启/停止,并在计时结束后释放掉计时器。

    1. import Foundation
    2. class TimerManager {
    3. static let shared = TimerManager()
    4. private var timer: DispatchSourceTimer?
    5. private var isTimerSuspended = false
    6. private init() {}
    7. func startTimer(delay: TimeInterval, completion: @escaping () -> Void) {
    8. let queue = DispatchQueue(label: "com.timermanager.queue")
    9. timer?.cancel() // Cancel any existing timer before starting a new one
    10. timer = DispatchSource.makeTimerSource(queue: queue)
    11. timer?.schedule(deadline: .now() + delay)
    12. timer?.setEventHandler(handler: { [weak self] in
    13. completion()
    14. self?.stopTimer()
    15. })
    16. isTimerSuspended = false
    17. timer?.resume()
    18. }
    19. func pauseTimer() {
    20. guard !isTimerSuspended, let timer = timer else { return }
    21. timer.suspend()
    22. isTimerSuspended = true
    23. }
    24. func resumeTimer() {
    25. guard isTimerSuspended, let timer = timer else { return }
    26. timer.resume()
    27. isTimerSuspended = false
    28. }
    29. func stopTimer() {
    30. guard let timer = timer else { return }
    31. timer.cancel()
    32. self.timer = nil
    33. isTimerSuspended = false
    34. }
    35. }

    使用TimerManager:

    1. // 启动定时器,10秒后执行操作
    2. TimerManager.shared.startTimer(delay: 10) {
    3. print("Timer fired!")
    4. }
    5. // 暂停定时器
    6. TimerManager.shared.pauseTimer()
    7. // 一段时间后...
    8. // 恢复定时器
    9. TimerManager.shared.resumeTimer()
    10. // 如果需要停止定时器,释放资源
    11. TimerManager.shared.stopTimer()

    这种全局计时器,我们经常会用到。比如需要延迟10秒弹出系统好评弹窗,但又不希望在“订阅页”弹窗。这时我们进入“订阅页”时就要暂停定时器,离开“订阅页”时再恢复计时。

  • 相关阅读:
    slice切片底层原理
    openMP学习笔记 -编程模型
    Spring Boot + Vue3前后端分离实战wiki知识库系统<八>--分类管理功能开发二
    Java面试——RPC协议
    [2023 java毕业设计源码]基于SpringBoot的在线交友系统包运行成功]
    图的应用4.0-----关键路径(AOE网)
    用numpy生成18种特殊数组
    WordPress页脚配置备案号
    观察者模式:包工头的救赎
    SpringCloud学习-周阳
  • 原文地址:https://blog.csdn.net/u012881779/article/details/136199571