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 完成块中设置 @Published var 不更新 SwiftUI 视图
Swiftui Firebase AddSnapShotListener