timer - 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)
}
解决方案
由于 SwiftUI 中的视图是struct
s,因此最好使用配置class
器ObservableObject
来更新 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"
}
}
推荐阅读
- pytorch - 火炬堆栈产生错误的尺寸
- laravel-7 - 通过 API 验证电子邮件
- javascript - 如何在同一php页面上的分页链接按钮上传递id而不更改链接?
- discord.js - 使用户失败了他们的抢劫尝试 discord.js
- python - 为什么我的数组不显示嵌入维度?
- ibm-cloud - 对话节点内的 IBM Watson Assistant 搜索技能始终返回 3 个结果
- awk - 具有修改可绘制脚本的中间步骤的 gnuscript 所需的常量表达式
- python - 使 pytest 仅在完整的测试套件运行时才需要代码覆盖
- shell - 将文本行换行到指定的字符长度限制,支持 ansi 颜色代码
- verilog - 多路复用器在处理之前是否依赖所有输入的值?