【发布时间】:2019-07-15 01:58:25
【问题描述】:
我不明白 SwiftUI 和 DispatchQueues 如何工作的问题。这是代码。
这有效,并将继续每秒刷新计数器状态变量。
// Example 1 - This works
struct TimerButtonTest : View {
@State var counter: Int = 0
var body: some View {
start()
return VStack { Text("\(counter)") }
}
func start() {
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(1000)) {
self.counter += 1
}
}
}
这不是。按下按钮后,计数器增加 1(1 秒后)但停止。
// Example 2 - This does not work
struct TimerButtonTest : View {
@State var counter: Int = 0
var body: some View {
return Button(action: {self.start()}, label: {Text("\(counter)")})
}
func start() {
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(1000)) {
self.counter += 1
}
}
}
为什么计数器不像第一个示例那样继续递增?
【问题讨论】:
-
@Paulw11 已经在您的代码中指出了问题,您可以检查条件 if counter != 0 然后在您的 return 语句上方手动调用 start 或者您可以有另一个状态变量来知道天气计数器开始与否,并采取相应的行动