iOS App加载多群组帖子后无法按时间戳排序的解决方法
多群组帖子合并后按时间戳排序的解决方案
问题根源
- 单群组内排序后直接合并数组,元素顺序按群组遍历顺序拼接,导致整体乱序
- 使用
table.sort时闭包参数类型错误,误将DataSnapshot作为参数,但数组存储的是帖子模型对象
解决步骤
- 等待所有异步请求完成:用
DispatchGroup确保所有群组的帖子都加载完成后再执行排序,避免异步加载导致的排序时机错误 - 修正排序闭包参数:针对数组存储的帖子模型(比如
Post类),直接比较模型的userTime属性
修正后的代码示例
var table: [Post] = [] let dispatchGroup = DispatchGroup() // 遍历关注的群组ID for groupId in followedGroups { dispatchGroup.enter() // 加载单群组帖子,先做单群组内排序 Database.database().reference().child("groups").child(groupId).child("posts") .queryOrdered(byChild: "userTime") .observeSingleEvent(of: .value) { snapshot in defer { dispatchGroup.leave() } // 确保请求完成后离开组 var groupPosts: [Post] = [] // 解析当前群组的所有帖子 for childSnapshot in snapshot.children { guard let postSnapshot = childSnapshot as? DataSnapshot else { continue } let post = Post(snapshot: postSnapshot) // 假设你的Post模型有对应的初始化方法 groupPosts.append(post) } // 将当前群组的帖子合并到总数组 table.append(contentsOf: groupPosts) } } // 所有请求完成后统一排序并刷新UI dispatchGroup.notify(queue: .main) { // 按userTime降序排序(最新帖子在前) table.sort { postA, postB in return postA.userTime > postB.userTime } // 刷新表格 self.tableView.reloadData() }
错误说明
你遇到的Contextual closure type '(DataSnapshot, String?) -> Void' expects 2 arguments错误,是因为排序闭包错误地使用了DataSnapshot类型参数。实际上你的table数组存储的是帖子模型实例,排序时应该传入两个模型对象,比较它们的userTime属性即可。
内容的提问来源于stack exchange,提问作者submariner
相关产品推荐
相关产品推荐

