如何加载Firebase多个子节点数据并在同一tableView展示
多placeID数据同TableView展示实现方案
Firebase Realtime Database 不支持单条查询同时跨多个不同子节点路径取数,要在同一个tableView展示多个placeID关联的评论,核心思路是逐个查询目标节点,拉取完所有数据后合并排序,再统一刷新表格。
实现注意事项
- 不要在单个节点的查询回调里清空数据源数组,否则先拉到的其他节点数据会被覆盖
- 用
DispatchGroup管理多异步请求,保证所有节点数据拉取完成后再做合并、排序、刷新操作,避免出现数据不全的问题 - 多节点场景下不要每个节点单独取最新N条后直接拼接,要拿到所有目标评论后统一按时间排序,再截取你需要展示的条数,才能保证列表顺序正确
- 原代码中在循环里给全局变量
ViewComments.commentIDNew赋值的写法有问题,循环每次执行都会覆盖这个值,后续使用会拿到错误的commentID,需要改成点击cell时根据当前indexPath取对应行的commentID
可直接参考的实现代码
func datenBankAbfrage () { // 替换为你需要同时展示的所有placeID数组 let targetPlaceIDs: [String] = [ViewController.placeidUebertragen, "第二个待展示的placeID", "第三个待展示的placeID"] let baseRef = Database.database().reference().child("placeID") var allComments: [importComment] = [] let dispatchGroup = DispatchGroup() // 遍历所有目标placeID逐个发起查询 for placeId in targetPlaceIDs { dispatchGroup.enter() let placeRef = baseRef.child(placeId) // 如果需要只拉取一次用observeSingleEvent,需要实时监听就换回observe placeRef.queryOrdered(byChild: "userTime").queryLimited(toLast: 10).observeSingleEvent(of: .value, with: { snapshot in defer { dispatchGroup.leave() } guard snapshot.childrenCount > 0 else { return } for video in snapshot.children.allObjects as! [DataSnapshot] { // 做类型安全判断,避免字段缺失导致强制解包崩溃 guard let object = video.value as? [String: AnyObject], let userName = object["userName"] as? String, let userGroup = object["userGroup"] as? String, let userComment = object["userComment"] as? String, let userTime = object["userTime"] as? Int, let userLikes = object["userLikes"] as? Int, let commentId = object["commentId"] as? String else { continue } let comment = importComment( userName: userName, userGroup: userGroup, userComment: userComment, userTime: userTime, userLikes: userLikes, commentId: commentId ) allComments.append(comment) } }) } // 所有查询完成后在主线程处理数据、刷新UI dispatchGroup.notify(queue: .main) { // 按评论时间倒序,最新评论排在最前 self.table = allComments.sorted(by: { $0.userTime > $1.userTime }) // 如果只需要展示全局最新的10条,取消注释下面这行即可 // self.table = Array(self.table.prefix(10)) self.tableView.reloadData() } }
实时监听场景的额外调整
如果需要保留数据实时监听能力,把代码里的observeSingleEvent换回observe后,还要补充两个处理:
- 给
importComment数据模型新增placeId字段,拉取数据时把当前查询的placeID存到对应评论模型里 - 每次某个节点的监听回调触发时,先从数据源数组中移除所有属于该placeID的旧评论,再把新拉到的该节点评论追加进数组,之后重新排序刷新表格,避免列表出现重复数据。
内容的提问来源于stack exchange,提问作者submariner
相关产品推荐
相关产品推荐

