Text 进程仍在运行时更新SwiftUI中的文本
我喜欢在屏幕上更新一个文本来通知用户进度。我在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 {
@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,如上所示。