You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于用户兴趣类别优先排序Feed帖子并保留分页功能?

实现方案

核心思路:不做数据库层面的类别筛选,先按时间分页拉取所有帖子,再在客户端将匹配用户兴趣类别的帖子前置展示,同时保留基于时间排序的分页逻辑,避免一次性加载大量数据。

修改后的代码

static func fetchFeedPostsWithPagination(lastDocument: DocumentSnapshot?, limit: Int) async throws -> (posts: [Post], lastDocument: DocumentSnapshot?) {
        
    let uid = Auth.auth().currentUser?.uid
    let currentUser = try await UserService.fetchUser(withUid: uid ?? "")
    let userCategories = currentUser.categories?.keys.map { $0 } ?? []

    // 1. 按时间降序分页查询所有帖子,不做类别筛选
    var query: Query = postsCollection
        .order(by: "timestamp", descending: true)
        .limit(to: limit)
    
    if let lastDocument = lastDocument {
        query = query.start(afterDocument: lastDocument)
    }
    
    let snapshot = try await query.getDocuments()
    var posts = try snapshot.documents.compactMap { try $0.data(as: Post.self) }
    
    // 2. 并发获取帖子作者信息,提升请求效率
    await withTaskGroup(of: (index: Int, user: User).self) { group in
        for (index, post) in posts.enumerated() {
            group.addTask {
                let user = try await UserService.fetchUser(withUid: post.ownerUid)
                return (index, user)
            }
        }
        
        for await result in group {
            posts[result.index].user = result.user
        }
    }
    
    // 3. 将匹配兴趣类别的帖子前置,两组内部仍保留时间降序
    let matchingPosts = posts.filter { userCategories.contains($0.category) }
    let nonMatchingPosts = posts.filter { !userCategories.contains($0.category) }
    let sortedPosts = matchingPosts + nonMatchingPosts
    
    let lastDoc = snapshot.documents.last
    return (sortedPosts, lastDoc)
}

关键修改说明

  • 移除类别筛选:删掉原代码中whereField("category", in: userCategories)的逻辑,确保所有帖子都能被查询到。
  • 客户端分组排序:把查询到的帖子拆分为「匹配兴趣」和「不匹配兴趣」两组,合并后让匹配组优先展示,两组内部依然保持原有的时间降序顺序。
  • 优化作者信息获取:用withTaskGroup并发请求用户信息,替代原代码的顺序循环请求,提升加载速度。
  • 保留分页逻辑:分页依然依赖时间排序的lastDocument,每次仅拉取limit数量的帖子,避免大量数据一次性加载。

进阶优化方向(可选)

如果想在数据库层面优先获取匹配类别的帖子,减少客户端处理的数据量,可以采用两次查询合并的方式:

  1. 先查询匹配用户类别的帖子,按时间降序取limit条;
  2. 若数量不足limit,再查询不匹配类别的帖子,按时间降序取剩余数量;
  3. 合并两组结果返回,同时跟踪两个查询的lastDocument用于下一页分页。

这种方式实现更复杂,但能降低客户端的排序压力,适合用户兴趣类别覆盖内容较多的场景。

内容的提问来源于stack exchange,提问作者CobraCodes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 14:05:21