【发布时间】:2021-05-15 16:04:53
【问题描述】:
我有一个 tableView,它从 Firestore 集合中获取所有文档,我想在用户刷新 tableView 后将最后一个文档添加到 Firestore 时只获取一次,之后我想删除监听器,以便在用户刷新时tableView 它只获取一次文档,我使用了 detach listener [从这里的文档] [1] 但它没有用
func updatedFireStoredata() {
let listener = Firestore.firestore().collection("collection1").order(by: "date").limit(toLast: 1).addSnapshotListener() { querySnapshot, error in
guard let snapshot = querySnapshot else {
print("Error fetching snapshots: \(error!)")
return
}
snapshot.documentChanges.forEach { diff in
if (diff.type == .added) {
let data = diff.document.data()
self.amount.append(data["amount"] as? String ?? "")
print("New city: \(diff.document.data())")
}
}
}
table2.reloadData()
listener.remove()
}
【问题讨论】:
-
这用户每次刷新 tableView 被称为轮询,它可能没有必要(并且可能会让用户感到烦恼)。您应该在您的 firebase 上设置一个 listener 又名 observer,以便当有更新的数据时 firebase 会通知您的应用。
-
@Jay 用户应该刷新 tableView 以显示检索到的新文档,这里的问题是当用户刷新 tableView 应用程序检索文档时,每次用户刷新表视图并且我想检索如果用户刷新 tableView 则只有一次。
-
@Jay 我更新了我的问题,请你检查一下
-
方法就是问题所在。您不应该要求用户一直按刷新来获取更新的数据。这应该会自动发生,并且用户应该始终拥有当前数据而无需交互。完全删除
listener.remove()并在 Firebase 闭包中移动table2.reloadData()这样当添加新数据时,您的应用程序将自动接收它并更新表。请注意,Firebase 是异步的 - 刷新闭包 outside 的 tableView 将在闭包中执行 before 代码,因此它需要在内部。
标签: arrays swift firebase firebase-realtime-database google-cloud-firestore