首页 > 解决方案 > 如果我转到另一个视图控制器并使用 segue 返回到同一个视图控制器,snapshotListener 是否会重新读取所有文档?

问题描述

这是我的代码中的一个小片段。

db.collection("tasks").document(Auth.auth().currentUser?.uid ?? "").collection("currentUser").whereField("Date", isEqualTo: date).addSnapshotListener{ (querySnapshot, err) in
    self.task = []
    if  querySnapshot!.documents.isEmpty{
         self.firstView.alpha = 1
         self.labelText.alpha = 1
     }
    else{
        self.firstView.alpha = 0
        self.labelText.alpha = 0

        if let snapshotDocuments = querySnapshot?.documents{
           for doc in snapshotDocuments{
              let data = doc.data()
              print("xx")
              if  let descS = data["Task Description"] as? String, let dateS = data["Date"] as? String, let titleS = data["Task Title"] as? String, let type1 = data["Type"] as? String{

                 let newTask = Tasks(title: titleS, desc: descS, date: dateS, type: type1, docId: doc.documentID)
                 self.task.append(newTask)
                 DispatchQueue.main.async {
                     self.taskTableView.reloadData()
                     let indexPath = IndexPath(row: self.task.count - 1, section: 0)
                     self.taskTableView.scrollToRow(at: indexPath, at: .top, animated: false)
                 }
              }
           }
        }
    }
}

问题是当我去添加另一个任务时,我对另一个视图控制器执行 segue。从那里我添加了一个文档,但我需要执行另一个 segue 才能返回,因为我使用的是汉堡菜单。我确实尝试过使用 getDocuments(source: cache),当用户没有添加任务时,它确实减少了写入。但是当他们确实添加了一项任务时,它会重新加载所有文档,增加大量读取。使用 snapshotListner 的目的是减少读取,但是,我不确定当我再次对屏幕执行 segue 时它是否会重新读取数据。谢谢你!

标签: swiftxcodefirebasegoogle-cloud-firestore

解决方案


快照监听器根本不关心 UI 上发生的任何事情,例如 segue。快照侦听器仅在您第一次添加它并且远程数据中有更新时触发。您可以微调快照侦听器以忽略或包含缓存或假定的数据(使用快照的元数据属性)。但这是实时数据的本质,随着用户做事它可能会更新很多。唯一的解决方法是提出最有效的数据架构(在服务器端)以降低读取成本。

顺便说一句,您的代码编写得很危险。在将侦听器附加到即使您的代码建议可能是空字符串的 userId 之前,您应该首先检查是否存在有效的 userId。你永远不应该像你正在做的那样强制解包快照,因为即使是轻微的网络错误也会导致整个应用程序崩溃。


推荐阅读