计时器是否可以安排为实时启动



制作一个简单的计时器很容易。我们知道如何建造在一定时间间隔内起火的东西。使用Dispatch Queue可以延迟功能和其他任务是否有人尝试过以定时精度启动函数

我发现一些文档显示,在DispatchFramework中有一些结构处理微秒(DispatchWallTime(和纳秒(DispatchTime(精度。假定定时器不是"定时器";实时">我们如何才能在以后精确地启动函数

这里有一个简单的计时器,目标是使启动功能在稍后的时间启动,但准确地说是在一分钟或特定秒的开始。

struct ContentView: View {
@StateObject var timeManager = TimeManager()
@State var date = Date.now.formatted(.dateTime.hour().minute().second())
var body: some View {
VStack {
Text("Current Time: (date)")
Text("Elapsed Time: (timeManager.elapsedTime)").monospacedDigit()
HStack {
Button(action: {
timeManager.start()
}) {
Image(systemName: "play.fill")
.tint(.green)
}

Button(action: {
timeManager.stop()
}) {
Image(systemName: "stop.fill")
.tint(.red)
}
}
.font(.largeTitle)
}
}
}
class TimeManager: ObservableObject {
@Published var elapsedTime = 0
var timer = Timer()

// Make this function start at a later date/time with precision.
func start() {
timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { timer in
self.elapsedTime += 1
}
}

func stop() {
timer.invalidate()
}
}

我找到了一个切中要害的答案。这是Paul Hudson的,如果有人想更深入地回答这个问题,我会把它标记为答案。

let date = Date().addingTimeInterval(5)
let timer = Timer(fireAt: date, interval: 0, target: self, selector: #selector(runCode), userInfo: nil, repeats: false)
RunLoop.main.add(timer, forMode: .common)

我喜欢这个答案的原因有两个,一个是你可以用日期。然后,您可以将其绑定到日期选择器或您选择的任何任意日期或时间。第二,我喜欢它,因为它是Swift内置的。如果您有更好的解决方案,请添加您的答案。谢谢大家!

相关内容

最新更新