ios - Swift 中的高精度定时器

标签 ios swift macos timer

在 Swift 中,对于控制外部硬件的精确时钟,最好的解决方案是什么?我需要编写一个能够以每秒设定的速率(数百或数千赫兹)可靠且高精度地触发的循环函数。

最佳答案

您可以定义一个 GCD 计时器属性(因为与 NSTimer/Timer 不同,您必须维护自己对 GCD 计时器的强引用):

var timer: DispatchSourceTimer!

然后使用 makeTimerSource(flags:queue:) 创建一个计时器(可能是一个 .strict 计时器,它不受合并、应用程序小睡等的影响,需要注意电源/电池/等的影响) :

let queue = DispatchQueue(label: "com.domain.app.timer", qos: .userInteractive)
timer = DispatchSource.makeTimerSource(flags: .strict, queue: queue)
timer.scheduleRepeating(deadline: .now(), interval: 0.0001, leeway: .nanoseconds(0))
timer.setEventHandler { 
    // do something
}
timer.resume()

请注意,您应该优雅地处理计时器无法处理您正在寻找的精度的情况。正如 documentation 所说:

Note that some latency is to be expected for all timers, even when a leeway value of zero is specified.

关于ios - Swift 中的高精度定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43746336/

相关文章:

ios - 如何在 Realm 中创建 NSData 对象的可选列表(数组)?

swift - 如何在 Xcode 中左对齐导航栏的标题?

macos - 批量创建时的 Elasticsearch 异常

macos - 在 macOS 上以编程方式打开“关于应用程序”窗口

iphone - 如何在不使用按钮的情况下移动到另一个 View

ios - 是否可以将 iOS 模拟器更改为使用 24 小时制?

ios - 为纵向和横向模式获得相同的屏幕宽度和高度

objective-c - 从 Objective-C 中的正则表达式中提取字符串

ios - UIViewControllers 中的 UIViewController

xcode - 将文件从应用程序包复制到用户的应用程序支持文件夹