我有一个已发布的varprediction
:
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
中得到更新,但我的UI视图与文本(trainingStatus.prediction)
从未得到更新。
我如何更新我的视图来获取最新发布的值?
你可以有效地(几乎)利用一个单例。
你首先需要改变你的ObservableObject类,并添加一个新的常量:
class TrainingStatus: ObservableObject {
@Published var isTrained: Bool = false
@Published var modelUrl: URL = URL(fileURLWithPath: "hello")
@Published var prediction:String = ""
public static let shared = TrainingStatus()
}
那么你可以通过声明下面的语句在其他地方访问它:
var trainingStatus = TrainingStatus.shared
现在你可以随意修改它的值。这也会在ObservableObject类中更新它,因此在任何其他视图中使用它都可以更改它。
用例示例:
struct SidebarView: View {
var trainingStatus = TrainingStatus.shared
var body: some View {
VStack{
NavigationView{
Section{
Text("Trained? " + String(trainingStatus.isTrained))
Text("Prediction: (trainingStatus.prediction)") //This is now referencing your new shared variable of trainingStatus
}
}
.navigationTitle("Data")
}
.environmentObject(modelData)
.environmentObject(trainingStatus)
}
}
}
要修改常量的类:
class ClassificationController: ObservableObject {
var trainingStatus = TrainingStatus.shared
...
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() --- no longer need this line
trainingStatus.prediction = self.prediction //this is now changing your singleton
print("set prediction: (trainingStatus.prediction)")
}
}