【发布时间】:2021-10-13 04:23:14
【问题描述】:
我试图了解一种设计模式,用于从 SwiftUI 视图中访问参与者类型中保存的隔离状态。
拿这个幼稚的代码:
actor Model: ObservableObject {
@Published var num: Int = 0
func updateNumber(_ newNum: Int) {
self.num = newNum
}
}
struct ContentView: View {
@StateObject var model = Model()
var body: some View {
Text("\(model.num)") // <-- Compiler error: Actor-isolated property 'num' can not be referenced from the main actor
Button("Update number") {
Task.detached() {
await model.updateNumber(1)
}
}
}
}
可以理解,当我尝试访问隔离值时,我得到了编译器错误Actor-isolated property 'num' can not be referenced from the main actor。但是我不明白如何在视图中显示这些数据。我想知道我是否需要一个 ViewModel 来观察演员,并在主线程上自我更新,但得到编译时错误Actor-isolated property '$num' can not be referenced from a non-isolated context。
class ViewModel: ObservableObject {
let model: Model
@Published var num: Int
let cancellable: AnyCancellable
init() {
let model = Model()
self.model = model
self.num = 0
self.cancellable = model.$num
.receive(on: DispatchQueue.main)
.sink { self.num = $0 }
}
}
其次,想象一下如果这段代码确实编译了,那么当我点击主线程上的界面没有更新的按钮时,我会得到另一个错误......再次,我不确定如何从演员内部实现这一点?
【问题讨论】:
标签: swift concurrency swiftui