在进程仍在进行时更新 SwiftUI 中的文本 运行

Update Text in SwiftUI while process is still running

我喜欢在屏幕上更新一段文字来通知用户进度。我在 SwiftUI 中使用文本。每当我更改此消息时,它应该被更新,即使进程仍然是 运行。例如:

@State private var message = "-"

    var body: some View {

        VStack {
            Button("Run") {
                print("Tapped!")
                for i in 0 ... 100 {
                    self.message = "\(i)"
                    for _ in 1...1000 {
                        print(".")  // some time consuming stuff
                    }
                }
            }

            Text(message)
                .frame(width: 100)
                .padding()
        }
        .padding(40)
    }

当我更改消息时,它应该会更新屏幕。不幸的是,它只在循环结束时更新文本,所以它显示 100。它应该显示 1、2、... 100。

我是否需要像在使用 "DispatchQueue.main.async" 等的经典开发中那样的特殊棘手队列,或者在 SwiftUI 中是否有更简单的方法?

swift 打印出 1000 条语句太快了...

顺便说一句...耗时的事情应该总是不在主线程上完成,UI 事情应该总是在主线程上完成;)

试试这个

struct ContentView: View {
    @State private var message = "-"

    var body: some View {

        VStack {
            Button("Run") {
                print("Tapped!")
                OperationQueue().addOperation {
                    for i in 0 ... 100 {

                        OperationQueue.main.addOperation {
                            self.message = "\(i)"
                        }
                        sleep(1)
                    }

                }
            }

            Text(message)
                .frame(width: 100)
                .padding()
        }
        .padding(40)
    }
}

我更喜欢DispatchQueue,所以一些备用

Button("Run") {
    print("Tapped!")
    DispatchQueue.global(qos: .background).async {
        for i in 0 ... 100 {
            DispatchQueue.main.asych {
                self.message = "\(i)"
            }
            for _ in 1...1000 {
                print(".")  // some time consuming stuff
            }
        }
    }
}