Ios Firestore&;SwiftUI-我的快照阅读器是否不必要地读取数据库?

Ios Firestore&;SwiftUI-我的快照阅读器是否不必要地读取数据库?,ios,swift,google-cloud-firestore,swiftui,Ios,Swift,Google Cloud Firestore,Swiftui,我有一个设置了firebase的项目,我有一个类似于firebase示例的函数设置,但是firebase文档在我的可观察对象中更新@Published vars: func getDataFromSession(env: GlobalEnvironmentObject) { db.collection("sessions").document("firstSession") .addSnapshotListener { documentSnaps

我有一个设置了firebase的项目,我有一个类似于firebase示例的函数设置,但是firebase文档在我的可观察对象中更新@Published vars:


func getDataFromSession(env: GlobalEnvironmentObject) {
db.collection("sessions").document("firstSession")
    .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
      }
      print("Current data: \(data)")
      env.data1 = data[data1]
// env.data1 is the @Published bar data1
    }
}
我在swiftui视图中调用此函数:

var body: some View {
  
        let fbConnection = FirebaseConnectionHandler(env: env)
        fbConnection.getDataFromSession()
当我运行我的应用程序时,我的调试窗口正在以闪电般的速度执行打印(“当前数据:(data)”)行,尽管可观察对象/全局环境中的值没有变化。我的印象是,快照侦听器仅在数据更改时执行读取,而swiftui视图仅在@Published属性更改时更新,因此不会发生任何情况(因此它不应该像疯了一样读取)。我不确定它是否在一行中执行大量读取,或者输出是否正常(obv我只希望它在文档发生更改时读取)


我到底做错了什么?如何防止超级读取并使其仅在数据更新时读取?

欢迎使用Stackoverflow。放松点,你和SDK没有做错什么。您经历的第一次读取是由于数据的初始状态

查看文档查看快照之间的更改:


要点:第一个查询快照包含为所有查询添加的事件 与查询匹配的现有文档。这是因为你 获取一组更改,这些更改使您的查询快照最新 查询的初始状态。例如,这允许您 直接从第一次收到的更改填充UI 查询快照,无需添加处理快照的特殊逻辑 初始状态

初始状态可以直接来自服务器,也可以来自本地服务器 隐藏物如果本地缓存中存在可用状态,则查询 快照最初将填充缓存的数据,然后 当客户机赶上服务器时,使用服务器的数据进行更新 服务器的状态


欢迎来到Stackoverflow。放松点,你和SDK没有做错什么。您经历的第一次读取是由于数据的初始状态

查看文档查看快照之间的更改:


要点:第一个查询快照包含为所有查询添加的事件 与查询匹配的现有文档。这是因为你 获取一组更改,这些更改使您的查询快照最新 查询的初始状态。例如,这允许您 直接从第一次收到的更改填充UI 查询快照,无需添加处理快照的特殊逻辑 初始状态

初始状态可以直接来自服务器,也可以来自本地服务器 隐藏物如果本地缓存中存在可用状态,则查询 快照最初将填充缓存的数据,然后 当客户机赶上服务器时,使用服务器的数据进行更新 服务器的状态


好的,所以我想出来了…如果您正在更新firebase中的可观察对象,请将侦听器对象放在您的视图中(在“var body:some view{”)下

然后,获取结构中的任何视图(HStack、ZStack等)并添加一个.onAppear修饰符,然后调用函数从那里更新firebase


原来视图一直在更新,但是.onAppear将启动刷新一次…

好的,所以我想出来了…如果您正在更新firebase中的可观察对象,请将侦听器对象放在视图中(在“var body:some view{”)下

然后,获取结构中的任何视图(HStack、ZStack等)并添加一个.onAppear修饰符,然后调用函数从那里更新firebase


结果是视图一直在更新,但是.onAppear将启动刷新一次…

因此,当我将数据写入Firestore时,我的所有数据都被写入同一个文档。在搜索web后,我了解到,对于Firestore中的侦听器,这是一个要么全有,要么全无的问题。因此,我的整个文档都被删除了被调用和更新,在别处触发更新,这将调用和触发,等等


为了解决这个问题,我将文档拆分为两个文档,其中一个应用程序可以对一个进行读取,但只能对另一个进行写入,而另一个应用程序则相反(对另一个进行读取,对另一个进行写入)通过这种方式,监听器在每个文档级别调用更改,并避免循环…

因此,当我将数据写入Firestore时,我的所有数据都被写入同一个文档。在搜索web后,我了解到,对于Firestore中的监听器,这是一个全有或全无的问题。因此,我的整个文档都被删除了被调用和更新,在别处触发更新,这将调用和触发,等等


为了解决这个问题,我将文档拆分为两个文档,其中一个应用程序可以对一个进行读取,但只能对另一个进行写入,而另一个应用程序则相反(对另一个进行读取,对另一个进行写入)。这样,侦听器在每个文档级别调用更改,并避免循环…

这毫无意义,因为终端只是一遍又一遍地打印相同的数据…当我删除代码以将firebase中的数据设置为与可观察对象数据相等时,它似乎工作正常…这没有意义,因为终端是just一遍又一遍地打印相同的数据…当我删除代码,将firebase中的数据设置为与可观察对象数据相等时,它似乎工作正常。。。