首页 > 解决方案 > 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
        }
    }
}

标签: swiftswiftuitimer

解决方案


不,没有保证会每秒调用一次。特别是,您的应用程序可能会被置于后台,并且不会调用此计时器。(超过 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() }
    }
}

推荐阅读