在进程仍在进行时更新 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
}
}
}
}
我喜欢在屏幕上更新一段文字来通知用户进度。我在 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
}
}
}
}