为啥在函数中使用已发布变量的更新值没有得到反映?

Posted

技术标签:

【中文标题】为啥在函数中使用已发布变量的更新值没有得到反映?【英文标题】:Why is the published variable's updated value not getting reflected when used in function?为什么在函数中使用已发布变量的更新值没有得到反映? 【发布时间】:2021-03-28 17:31:54 【问题描述】:

我正在尝试关注tutorial 以将 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)

    

【问题讨论】:

View 观察自己的 observable 属性是否依赖于它们,但它不知道(实际上也不知道)任何闭包(包括函数)内部发生了什么 @Asperi - 那么你建议如何获取更新后的 sessionId 值? 【参考方案1】:

@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")
        )
    

【讨论】:

以上是关于为啥在函数中使用已发布变量的更新值没有得到反映?的主要内容,如果未能解决你的问题,请参考以下文章

导入的变量更新未反映在父模块中

已声明且未使用 - 如何更新 IF 语句中的变量

为啥变量没有更新?任何逻辑

范围变量值的变化没有反映在我的字符串中

状态在 useEffect 中没有更新,为啥?

Ajax 调用不更新模板 django