定时器 (Timers)

具有自动内存管理的直观 Swift 定时器


Medium 文章:简化 Swift 定时器:彻底解决内存泄漏和复杂性问题

Timers 是一个轻量级的软件包,提供了一种方便的方式来处理和管理 Swift 中的定时器,尤其是在视图控制器中,可以自动管理定时器的生命周期。

import Timers

final class RefreshingViewController: UIViewController {
    let timers = Timers()

    func viewDidLoad() {
        super.viewDidLoad()
        
        timers.addRepeating(timeInterval: 1.0, withTarget: self) { (self) in
            self.reloadData()
        }
    }
    
    func reloadData() {
        // reload your data here
    }
}

Timers 会在视图控制器被销毁时自动使定时器失效,无需手动操作。

注意
帮助拯救乌克兰。 通过 United24 捐款,这是乌克兰总统的官方筹款平台

特性

安装

Swift Package Manager

  1. 点击 File → Swift Packages → Add Package Dependency(文件 → Swift 包 → 添加包依赖项)。
  2. 输入 https://github.com/dreymonde/Timers.git

注意
Timers 是一个非常简单的库,仅包含一个文件 (Timers.swift)。不要期望更新,此版本可能为最终版本。如果您需要其他功能,请随意 fork 或将 Timers.swift 直接复制到您的项目中并进行扩展。欢迎提交 PR。

指南

所有这些定时器都由 Timers 实例管理,并在 Timers 实例被释放时自动失效。

创建一个基本的重复定时器

import Timers

final class MyViewController: UIViewController {
    let timers = Timers()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        timers.addRepeating(timeInterval: 1.0, withTarget: self) { (self, timer) in
            self.reloadData()
        }
    }
    
    func reloadData() {
        // reload your data here
    }
}

创建一个具有容差的重复定时器

timers.addRepeating(timeInterval: 1.0, tolerance: 0.1, withTarget: self) { (self) in
    self.reloadData()
}

在这种情况下,定时器将具有 0.1 秒的轻微容差,这允许系统调整定时器的触发时间,以获得更好的系统性能。

创建一个在特定日期触发一次的定时器

let date = Date().addingTimeInterval(5) // Date 5 seconds from now

timers.fireAt(date, withTarget: self) { (self) in
    self.reloadData()
}

// or:

timers.fireAfter(timeInterval: 5, withTarget: self) { (self) in
    self.reloadData()
}

创建一个在特定日期触发并在设定间隔重复触发的定时器

timers.addRepeating(
    initiallyFireAt: Date().addingTimeInterval(10),
    thenRepeatWithInterval: 5.0,
    withTarget: self
) { (self, timer) in
    self.reloadData()
}

手动创建定时器

对于您想手动添加定时器的更自定义的使用场景

let customTimer = Timer(timeInterval: 1.0, repeats: true) { _ in
    print("This is a custom timer")
}

timers.addTimerManually(timer: customTimer)

清除所有定时器

如果您想停止并使所有定时器失效,您可以调用

timers.clear()

另请参阅