swift - SwiftUI:使用计时器时,每次的平均执行次数会保持不变吗?
问题描述
我目前正在开发一个内置计时器元素的应用程序。因此,如果用户选择 30 分钟,应用程序将显示剩余时间 - 29:59、一秒后 29:58、29:57 等。计时器一次可以激活几个小时。经过一番研究,我发现有人说计时器不是那么准确,不应该用于“高精度计时”?所以我不确定这会带来什么。计时器在一定时间内执行的平均速率会在几个小时后保持不变吗?例如,如果我将计时器设置为每秒将整数加 1,则整数值会在 4 小时后为 14,400(给定或取大约 +/-10)(因为 4 小时中有 14,400 秒)?
import SwiftUI
struct ContentView: View {
@State var timeElapsed = 0
let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
var body: some View {
VStack{
Text(String(timeElapsed)) //Would this display 14400 after 4 hours?
}
.onReceive(timer) { _ in
timeElapsed += 1
}
}
}
解决方案
不,没有保证会每秒调用一次。特别是,您的应用程序可能会被置于后台,并且不会调用此计时器。(超过 4 小时,几乎可以肯定。)计时器不会累积未接来电。他们只是跳过它们。
您实现计时器的方式是从当前时间中减去开始时间,而不是尝试累积秒数。你想要更像这样的东西(未经测试):
struct ContentView: View {
@State var timeElapsed = 0
@State var startTime = Date()
let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
var body: some View {
VStack{
Text(String(timeElapsed)) //Would this display 14400 after 4 hours?
}
.onReceive(timer) { _ in
timeElapsed = Int(-startTime.timeIntervalSinceNow)
}
.onAppear { startTime = Date() }
}
}
推荐阅读
- microsoft-graph-api - Microsoft one note graph api 不会在部分中加载页面
- python - Matplotlib 创建平滑图
- python - Django Visual Studio 环境“....”不可用
- google-cloud-platform - 计算引擎备份
- php - MYSQL如何比较两个表的价格并显示所有结果
- python-3.x - python - 如何通过从list1中获取1个元素和从list2中获取其余元素等从2个列表中获取组合
- reactjs - 如何从 React JS 中的另一个选择字段获取动态选择字段的值
- c - C 类型符号
- python - Python:计算列表的累积值和月值的公式
- enterprise-architect - 如何在 Enterprise Architect 中更改连接器的箭头大小?