Firebase开发:实现仅显示当前登录用户创建的Cell数据
解决方法:只显示当前登录用户创建的Cell
嘿,这个需求其实很容易实现,核心是从Firestore查询数据时就过滤出当前用户的内容,这样不仅高效(减少不必要的数据传输),还能让后续的表格展示逻辑更简单。我给你一步步拆解修改:
1. 修改数据加载函数,添加用户过滤条件
你现有的loadCells()会拉取所有用户的Cell数据,我们只需要在查询时加上一个条件:只获取senders字段等于当前登录用户邮箱的文档。
修改后的loadCells()代码如下:
func loadCells() { CellArray = [] // 先确认当前有登录用户,没有的话直接清空表格 guard let currentUserEmail = Auth.auth().currentUser?.email else { print("用户未登录,无法加载Cell数据") DispatchQueue.main.async { self.tableView.reloadData() } return } db.collection(Constants.FStore.collectionName) // 关键:添加过滤条件,只获取当前用户的Cell .whereField(Constants.FStore.senders, isEqualTo: currentUserEmail) .order(by: Constants.FStore.dateField) .addSnapshotListener { querySnapshot, error in self.CellArray = [] if let e = error { print("获取数据时出现问题:\(e)") } else { if let snapshotDocuments = querySnapshot?.documents { for doc in snapshotDocuments { let data = doc.data() if let sender = data[Constants.FStore.senders] as? String, let cellFirst = data[Constants.FStore.firstText] as? String, let cellSecond = data[Constants.FStore.secondText] as? String { let newCell = CELLS(sender: sender, firstText: cellFirst, secondText: cellSecond) self.CellArray.append(newCell) } } // 所有数据处理完后再统一刷新表格,避免多次刷新 DispatchQueue.main.async { self.tableView.reloadData() } } } } }
这里的关键改动:
- 用
guard let先判断当前是否有登录用户,如果没有就直接清空数组并刷新表格,避免显示错误数据。 - 添加
.whereField(Constants.FStore.senders, isEqualTo: currentUserEmail),让Firestore只返回属于当前用户的Cell文档。 - 把
tableView.reloadData()移到循环外面,减少表格刷新次数,提升性能。
2. 表格行数方法无需额外修改
现在CellArray里已经只有当前用户的Cell数据了,所以numberOfRowsInSection直接返回数组长度就可以:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return CellArray.count }
额外提示
记得在用户登录状态变化时(比如用户刚登录成功、或者登出后重新登录),调用loadCells()方法刷新数据,确保表格显示的是当前用户的内容。
内容的提问来源于stack exchange,提问作者Ludus Marsianus
相关产品推荐
相关产品推荐

