为什么在函数中使用已发布变量的更新值时没有反映出来?



我正试图按照本教程将WatchConnectivity与SwiftUI一起使用。在手表的视图模型中,我能够成功地接收从iPhone发送的消息,并将其设置在类的已发布变量中,但当我尝试在ContentView中使用该值时,我只看到初始值,而看不到更新值。

ViewModelWatch

import Foundation
import WatchConnectivity
class ViewModelWatch : NSObject,  WCSessionDelegate, ObservableObject{
var session: WCSession
@Published var sessionId = ""

init(session: WCSession = .default){
self.session = session
super.init()
self.session.delegate = self
session.activate()
}

func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {

}

func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
DispatchQueue.main.async {
if let sessionId = message["sessionId"] {
self.sessionId = sessionId as! String
}
}
}
}

内容视图

import SwiftUI
struct ContentView: View {
@ObservedObject var model = ViewModelWatch()

var body: some View {
Button(action: startAction, label: {
Text("Test")
})


}

func startAction() {
print("sessionId", self.model.sessionId)
}
}

@Asperi-那么你建议如何获得更新的sessionId值?

解决方案是将操作移动到模型中,这样它就可以使用自己的属性进行操作,并直接在按钮(或按钮操作关闭(中使用该操作,如

class ViewModelWatch : NSObject,  WCSessionDelegate, ObservableObject{
// ... other code
func startAction() {                     // << move here
print("sessionId", self.sessionId)
}
}
struct ContentView: View {
@ObservedObject var model = ViewModelWatch()
var body: some View {
Button(action: model.startAction, label: {     // << use model
Text("Test")
})
}
}

最新更新