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

SwiftUI Publishing from background process to main 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()
        }
    }
}

或者,您可以查看可以为您完成工作的重复计时器: