首页 > 解决方案 > Swiftui - 定时器在一段时间内漂移

问题描述

我有一个锻炼计时器,可以让用户锻炼 30 秒,然后休息 10 秒。我有一些视觉方面可以用一些文字来表示这一点,说明它是休息时间还是锻炼时间。当计时器第一次启动时它工作得很好,但随着时间的推移它会漂移并且文本开始提前更改,那么它应该。一旦完成,我的计时器就会失效,我不明白为什么我会因为时间过去而得到不同的结果。

func start() {
    centreText = "Workout"
    Timer.scheduledTimer(withTimeInterval: 30, repeats: false) { timer in
        timer.invalidate()
        break()
    }
    
}

func break() {
    breatheText = "Break"
    Timer.scheduledTimer(withTimeInterval: 10, repeats: false) { timer in
        timer.invalidate()
        start()
    }
}

我如何称呼开始:

.onAppear {
  withAnimation(.workout(workDuration: 30, break: 10), {
  start()
 })

锻炼动画:

public static func workout(workDuration: Double, break: Double) -> Animation {
    return Animation.easeInOut(duration: workDuration).delay(break).repeatForever(autoreverses: true)
}

标签: timerswiftui

解决方案


由于 SwiftUI 中的视图是structs,因此最好使用配置classObservableObject来更新 UI。处理此类中的所有计时器并使用Published视图分配给的变量。

struct MyView: View {

  @StateObject private var config = MyViewConfig()
  
  var body: some View {
    Text(config.message)
    Button("Start", action: config.start)
  }
}

private final class MyViewConfig: ObservableObject {

  @Published private(set) var message = "Workout"

  func start() {
    // star timer and update message
    message = "Workout"
  }
  
  func stop() {
    // stop timer and update message
    message = "Break"
  }
}


推荐阅读