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()
}
}
}
或者,您可以查看可以为您完成工作的重复计时器:
我正在尝试从后台 运行 循环获取数据到主视图。
我可以看到计数器会增加(在终端中打印),但视图不会刷新当前值。每次显示的值都是零
我的代码片段如下:
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()
}
}
}
或者,您可以查看可以为您完成工作的重复计时器: