我已经设置了一个侦听器,但是它似乎并没有根据数据的变化而变化。流程如下:
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])])
}
答案 0 :(得分:0)
因此,我稍微研究了一下您的代码(由于代码示例不完整,因此我必须作一些假设),而且似乎您可能从未创建过要编写的文档。
updateData
仅更新现有的文档(请参见documentation)。要创建新文档,请使用setData
(请参见documentation)
将您的代码形式updateData
更改为setData
时,侦听器将按预期方式启动。
但是,最好将子集合customHabits
添加到每个用户文档中。这样,添加新习惯就像添加新文档一样简单,这也使查询变得容易得多。