SwiftUI + Firebase - 监听器不监听变化?

Posted

技术标签:

【中文标题】SwiftUI + Firebase - 监听器不监听变化?【英文标题】:SwiftUI + Firebase - Listener not listening for changes? 【发布时间】:2020-06-25 05:44:55 【问题描述】:

我已经设置了一个监听器,但它似乎并没有根据数据的变化而变化。流程如下:

    如果userCustomHabit 为空,用户会看到一个按钮 点击后,用户可以在工作表中的TextField 中输入文本以添加到userCustomHabit(字符串数组) 现在userCustomHabit 不为空,他们应该会看到其他内容

但是,我看到的问题是 userCustomHabits 没有在视图本身中更新,即使它正在 Firestore 数据库中更新。

有人知道这是为什么吗?包含代码如下:

查看

@ObservedObject var viewModel = RoutinesViewModel()

Group 
  if self.viewModel.userCustomHabits.isEmpty 
    Button(action: 
      self.showCreateSheet.toggle()
    ) 
      Text("Create your own habits")
        .font(Font.custom("Roboto-Regular", size: 20))
        .frame(width: geometry.size.width * 88/100, height: 200)
        .foregroundColor(.black)
        .background(Color.init(UIColor.systemGray5))
        .cornerRadius(40)
        .overlay(
          RoundedRectangle(cornerRadius: 40)
            .stroke(style: StrokeStyle(lineWidth: 2, dash: [20]))
            .foregroundColor(Color.init(UIColor.systemGray3))
        )
    
  
  else 
    // Something else
  

.onAppear(perform: self.viewModel.newHabitsListener)

表格

VStack 
  TextField("Enter text", text: $enteredText)
  Button("Add Habit") 
    self.viewModel.createNewHabits(newHabit: self.enteredText)
  

查看模型

@Published var userCustomHabits = [String]()

func newHabitsListener() 
  db.collection("users").document(currUser?.uid ?? "").addSnapshotListener  documentSnapshot, error in
    guard let document = documentSnapshot else 
      print("Error fetching document: \(error!)")
      return
    
    guard let data = document.data() else 
      print("Document data was empty.")
      return
    
    DispatchQueue.main.async 
      self.userCustomHabits = data["userCustomHabits"] as! [String]
    
  


func createNewHabits(newHabit: String) 
  db.collection("users").document(currUser?.uid ?? "").updateData(["userCustomHabits": FieldValue.arrayUnion([newHabit])])

【问题讨论】:

能否添加viewModel.createHabits的代码,以及如何绑定到viewModel?此外,如果您不需要元数据,您可能需要删除 includeMetadataChanges 添加了一些东西。不确定这是否是您所要求的。谢谢! 你能在你的视图中添加如何绑定到视图模型的代码吗? 我刚刚添加了。让我知道这是否是您正在寻找的。​​span> 彼得 - 你能帮我吗? 【参考方案1】:

所以我对您的代码进行了一些尝试(因为代码示例不完整,我不得不做出一些假设),而且您似乎一开始就没有创建您正在写入的文档。

updateData 仅更新现有 文档(请参阅documentation)。要创建新文档,请使用setData(请参阅documentation)

将代码形式 updateData 更改为 setData 时,侦听器按预期启动。

但是,最好为每个用户文档添加一个子集合customHabits。这样,添加新习惯就像添加新文档一样简单,也让查询变得更加容易。

【讨论】:

感谢您抽出宝贵时间彼得!不幸的是,该文件确实存在。正如我所提到的,它成功更新了用户文档,但监听器似乎没有捕捉到更新。 所以,看起来监听器在一定程度上工作。当我从 Firestore 手动将数据添加到 userCustomHabit 时,我可以看到我放置在 newHabitsListener 中的打印语句显示 userCustomHabits 现在已更新。但是,当我在视图中放置一个按钮以查看 self.viewModel.userCustomHabits 是什么时,我发现由于某种原因它是一个空字符串。所以监听器正在监听,但没有以某种方式更新 userCustomHabits 本身?

以上是关于SwiftUI + Firebase - 监听器不监听变化?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 和 swiftUI,监听实时更新奇怪的行为怪异

异步firebase调用后SwiftUI不更新变量

在 Firebase 完成块中设置 @Published var 不更新 SwiftUI 视图

Swiftui Firebase AddSnapShotListener

Firebase SwiftUI 和 Firebase Auth - 不读取用户 ID?

删除 SwiftUI 后 Firebase Firestore 不更新 UI