gpt4 book ai didi

swift - SwiftUI从后台进程发布到主视图

转载 作者:行者123 更新时间:2023-12-03 10:31:12 25 4
gpt4 key购买 nike

我正在尝试将数据从后台运行循环获取到主 View 。
我可以看到计数器将增加(在终端中打印),但是 View 不会刷新当前值。每次显示的值仍为零。
我的代码段如下:

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()
}
}
}
另外,您可以查看重复计时器,这些计时器将为您完成工作:
  • How to make an action repeat using Timer
  • 关于swift - SwiftUI从后台进程发布到主视图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63661880/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com