数据更改 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 调用以检索数据源

当我通过鼠标单击更改 SwiftUI 列表的选择时,@Published 属性的 didSet 被调用了两次

保存到 UserDefaults 被调用 19 次

SwiftUI 如何管理状态?

SwiftUI:更改数据源时选择器无法正确更新