【发布时间】:2021-08-07 02:43:38
【问题描述】:
我有一个已发布的 var prediction:
class TrainingStatus: ObservableObject {
@Published var isTrained: Bool = false
@Published var modelUrl: URL = URL(fileURLWithPath: "hello")
@Published var prediction:String = ""
}
我尝试在一个类中更新这个变量:
class ClassificationController: ObservableObject {
...
func processObservations(for request: VNRequest, error: Error?) {
DispatchQueue.main.async {
if let results = request.results as? [VNClassificationObservation] {
if results.isEmpty {
print("nothing found")
} else {
print("got a result: \(results)!")
let top3 = results.prefix(3).map { observation in
String(format: "%@ %.1f%%", observation.identifier, observation.confidence * 100)
}
self.prediction = top3.joined(separator: " ")
// attempt to set environment variable?
let trainingStatus = TrainingStatus()
trainingStatus.prediction = self.prediction
print("set prediction: \(trainingStatus.prediction)")
}
}
并在我的 UIView 中显示这个变量:
struct SidebarView: View {
@EnvironmentObject var trainingStatus: TrainingStatus
var body: some View {
VStack{
NavigationView{
Section{
Text("Trained? " + String(trainingStatus.isTrained))
Text("Prediction: \(trainingStatus.prediction)")
}
}
.navigationTitle("Data")
}
.environmentObject(modelData)
.environmentObject(trainingStatus)
}
}
}
但是,尽管 prediction 的值似乎在 ClassificationController 中更新,但我的带有文本 \(trainingStatus.prediction) 的 UI 视图从未更新。
如何更新视图以获取最新发布的值?
【问题讨论】:
-
如您所见,您不能这样做:
let trainingStatus = TrainingStatus() trainingStatus.prediction = self.prediction。阅读更多关于如何使用 ObservableObject 以及如何传递它们的信息。您想要实现的是仅使用 1 个 TrainingStatus。 -
@workingdog 你能推荐一些关于如何正确设置可观察对象的资源吗?