声明后不可访问的可观察对象中的变量(SwiftUI)

Posted

技术标签:

【中文标题】声明后不可访问的可观察对象中的变量(SwiftUI)【英文标题】:variable in observable object not accessible after declaration (SwiftUI) 【发布时间】:2020-06-29 10:38:12 【问题描述】:

我正在使用 SwiftUI 和 Firestore 制作应用程序。在 Firestore 数据库中,我保存了“householdID”。当应用程序的特定页面出现时,familyID 会在存储库类中设置,因此在未来的函数调用中,此 homeID 已经设置:

var body: some View 
  VStack 
    ...
    .onAppear(perform: 
        self.postListVM.postRepository.initHousehold(housholdID: self.session.session?.householdID ?? "")
    )
  

当我在 initHousehold(...) 方法中打印出局部变量时,homeID 会保存到我的局部变量中。

我遇到的问题是,当我现在尝试访问我的 postRepository 类中的局部变量 homeID(通过调用 addVote(..) 方法)时,它说该变量是空的:

class PostRepository: ObservableObject 
  var householdID: String? = ""
  
  func initHousehold(hid: String) 
    householdID = hid
    print(self.householdID) //prints Optional("LR2GuZaikjxb5Xq5yGBc")
  

  func addVote(post: Post, option: Int, counter: Int) 
      print(self.householdID) //prints Optional("")
  

我在另一个类中调用 addVote 函数,如下所示:

...
@Published var postRepository = PostRepository()
...
postRepository.addVote(...)
...

我在这个错误上苦苦挣扎了好几个小时,但无法弄清楚问题可能出在哪里。 感谢您提前提供任何帮助。

【问题讨论】:

你会显示 PostRepository 被实例化的代码/视图吗? 我在两个不同的类中实例化 PostRepository,都使用以下代码:@Published var postRepository = PostRepository()。这可能是问题吗?我认为使用@Published,我会有类似singelton 的东西? 我假设你只是在这两个地方创建了两个不同的实例,所以它们显然是独立存在的。相反,您必须在两个地方都使用一个实例,因为它们似乎是依赖的。 你是对的,这就是问题所在。我必须创建一个公共变量。非常感谢。 【参考方案1】:

问题是,我在两个不同的位置实例化了 PostRepository。我通过声明一个全局变量解决了这个问题。

【讨论】:

以上是关于声明后不可访问的可观察对象中的变量(SwiftUI)的主要内容,如果未能解决你的问题,请参考以下文章

以角度声明对象的可观察数组

SwiftUI - 从 Swift 类启动的可观察对象不会更新 ContentView() 上的 @ObservedObject

如何将可观察对象发布的整数变量绑定到 SwiftUI 中的 textField?

Combine + SwiftUI 中的最佳数据绑定实践?

如何对服务中的 BehaviorSubject 变量进行单元测试,它是组件中的可观察对象

React 如何订阅在另一个组件中声明的可观察对象