SwiftUI + Firebase-监听器不监听更改吗?

时间:2020-06-25 05:44:55

标签: firebase google-cloud-firestore swiftui

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

  1. 如果userCustomHabit为空,则用户会看到一个按钮
  2. 单击后,用户可以在工作表的TextField中输入文本以添加到userCustomHabit(字符串数组)中
  3. 现在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])])
}

1 个答案:

答案 0 :(得分:0)

因此,我稍微研究了一下您的代码(由于代码示例不完整,因此我必须作一些假设),而且似乎您可能从未创建过要编写的文档。

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

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

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