数据更改 SwiftUI 时多次调用 Firebase 侦听器
Posted
技术标签:
【中文标题】数据更改 SwiftUI 时多次调用 Firebase 侦听器【英文标题】:Firebase Listener Called Multiple Times When Data Change SwiftUI 【发布时间】:2021-12-29 10:52:14 【问题描述】:我有三个听众
-
向所有用户获取可见数据
获取两个日期之间的数据
获取所有数据
但是,当任何数据更改用户表时,Listener 会自动调用 4-5 次。
func listenData() -> ListenerRegistration
let listener = db.collection("user")
.whereField("FirstRow", isGreaterThanOrEqualTo: "FirstRow")
.whereField("lastRow", isLessThanOrEqualTo: "lastRow")
.addSnapshotListener querySnapshot, error in
if let error = error
print("listener error: \(error.localizedDescription)")
return
if let snapshot = querySnapshot
print("Without For Each = Data")
snapshot.documentChanges.forEach diff in
print("For Each = Data")
print("listen Public Rides Loop Done")
return listener
问题:当用户更改数据时,如何让Listener调用一次?
有人可以向我解释一下如何只调用一次监听器吗?
任何帮助将不胜感激。
提前致谢。
【问题讨论】:
如果您只想获取一次数据,请考虑使用get()
而不是addSnapshotListener
,如firebase.google.com/docs/firestore/query-data/get-data 所示
@FrankvanPuffelen get() 在用户更改数据或需要再次调用时自动调用?
如果您想再次加载数据,您需要再次调用它。如果要检测更改,则必须使用onSnapshot
。但这也将始终为您提供数据库中数据的初始快照。如果您的用例不需要它,您将不得不在您的应用程序代码中忽略它,或者您将不得不提出一个只返回您感兴趣的文档的查询(例如通过包括有一个时间戳)。无法告诉 Firebase 跳过初始负载。
抱歉@FrankvanPuffelen 回复晚了。我的代码有点忙。感谢您的帮助和建议
【参考方案1】:
Firestore 的onSnapshot
还会始终为您提供数据库中数据的初始快照。没有办法告诉 API 跳过这个初始快照。
如果您的用例不需要初始数据,您要么必须在应用程序代码中忽略它,要么必须提出一个只返回您感兴趣的文档的查询. 最后一个之前已经讨论过几次了,所以我建议看看这些questions的答案。
如果您想在第一次更改后停止收听更多更新,您可以在此时detach the listener。
【讨论】:
以上是关于数据更改 SwiftUI 时多次调用 Firebase 侦听器的主要内容,如果未能解决你的问题,请参考以下文章
当 ObservedObject 更改时,在 SwiftUI 视图中未调用 onReceive
SwiftUI:如何在搜索栏的文本更改时触发 api 调用以检索数据源