swift - 如果我转到另一个视图控制器并使用 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 时它是否会重新读取数据。谢谢你!
解决方案
快照监听器根本不关心 UI 上发生的任何事情,例如 segue。快照侦听器仅在您第一次添加它并且远程数据中有更新时触发。您可以微调快照侦听器以忽略或包含缓存或假定的数据(使用快照的元数据属性)。但这是实时数据的本质,随着用户做事它可能会更新很多。唯一的解决方法是提出最有效的数据架构(在服务器端)以降低读取成本。
顺便说一句,您的代码编写得很危险。在将侦听器附加到即使您的代码建议可能是空字符串的 userId 之前,您应该首先检查是否存在有效的 userId。你永远不应该像你正在做的那样强制解包快照,因为即使是轻微的网络错误也会导致整个应用程序崩溃。
推荐阅读
- bash - 列出名称长度在 3 到 6 个字符之间的所有文件
- scala - 在 scala 中使用 docker 运行测试用例
- android - 如何从磨损操作系统发送通知到手机
- python - 在 Python 中使用 BeautifulSoup 抓取表数据
- graphql - 放大 Graphql 仅列出当前用户 Todo 的
- javascript - 如何正确发送文件到 axios?
- javascript - 在 d3 中用不同的颜色在一个散点图矩阵中可视化两个数据集
- javascript - d3.csv(...).then 不是函数
- azure - Azure 函数和实体框架
- java - Apache HTTP 客户端 connectTimeout 与 connectionRequestTimeout