如何解决SwiftUI从后台进程发布到主视图
我可以看到计数器将递增(在终端中打印),但是视图不会刷新当前值。每次显示的值仍为零。
我的代码段如下:
struct ContentView: View {
@EnvironmentObject var loop : Loop
var body: some View {
vstack {
Text("Content View")
LoopView()
}
}
}
struct LoopView: View {
@EnvironmentObject var loop : Loop
var body: some View {
vstack {
Text("Loop View")
HStack {
Text("i = ")
Text("\(loop.i)")
}
}
}
}
class Loop: ObservableObject {
@Published var i: Int
func startLoop() {
while true {
print("i = \(self.i)")
self.i += 1
sleep(1)
}
}
init() {
dispatchQueue.main.async {
self.startLoop()
}
}
}
解决方法
这是因为您的sleep
实际上在主线程(DispatchQueue.main
)上运行。如果您确实要使用sleep
,请在后台运行DispatchQueue.global()
。但是随后您需要再次使用DispatchQueue.main
来更新@Published
变量:
class Loop: ObservableObject {
@Published var i: Int
func startLoop() {
while true {
print("i = \(self.i)")
DispatchQueue.main.async {
self.i += 1
}
sleep(1)
}
}
init() {
DispatchQueue.global(qos: .background).async {
self.startLoop()
}
}
}
或者,您可以查看重复计时器,它将为您完成工作:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。