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

Text 进程仍在运行时更新SwiftUI中的文本,text,queue,swiftui,screen,updating,Text,Queue,Swiftui,Screen,Updating,我喜欢在屏幕上更新一个文本来通知用户进度。我在SwiftUI中使用文本。每当我更改此消息时,它都应该被更新,即使进程仍在运行。例如: @State private var message = "-" var body: some View { VStack { Button("Run") { print("Tapped!") for i in 0 ... 100 {

我喜欢在屏幕上更新一个文本来通知用户进度。我在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。。。一百


我是否需要像使用“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
            }
        }
    }
}

谢谢。所以SwiftUI没有改变这种行为。我将使用DispatchQueue,如上所示。