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

Firebase Realtime Database(Swift):如何仅加载近30天评论?

解决Firebase Realtime Database加载近30天评论的问题

核心思路

iOS端Firebase Realtime Database的queryStarting(atValue:)就是对应Android的whereGreaterThan方法,你只需要正确计算30天前的时间戳,然后以此为起点查询所有时间戳晚于该值的评论即可。

修正后的代码

func loadData() {
    activityIndicatorView.startAnimating()
    guard let placeIdFromSearch = ViewController.placeidUebertragen else {
        activityIndicatorView.stopAnimating()
        return
    }
    
    // 计算30天前的时间戳(单位:秒,与timeIntervalSince1970一致)
    let thirtyDaysInSeconds: TimeInterval = 30 * 24 * 60 * 60
    let thirtyDaysAgo = Date().timeIntervalSince1970 - thirtyDaysInSeconds
    let thirtyDaysAgoTimestamp = Int(thirtyDaysAgo)
    
    // 构建查询:按userTime排序,只加载时间戳大于等于30天前的评论
    let query = Database.database().reference()
        .child("placeID/\(placeIdFromSearch)")
        .queryOrdered(byChild: "userTime")
        .queryStarting(atValue: thirtyDaysAgoTimestamp)
    
    query.observe(.childAdded) { [weak self] snapshot in
        guard let self = self else { return }
        guard let dic = snapshot.value as? [String: Any] else { return }
        let newPost = importPosts(dictionary: dic, key: snapshot.key)
        guard let userUid = newPost.userID else { return }
        
        self.fetchUser(uid: userUid) {
            self.table.insert(newPost, at: 0)
            self.activityIndicatorView.stopAnimating()
            self.tableView.reloadData()
        }
    }
}

func fetchUser(uid: String, completed: @escaping () -> Void) {
    Database.database().reference()
        .child("user")
        .child(uid)
        .child("userInformation")
        .observeSingleEvent(of: .value) { snapshot in // 建议用单次监听避免重复插入数据
            guard let dic = snapshot.value as? [String: Any] else {
                completed()
                return
            }
            let newUser = UserModel(dictionary: dic)
            self.users.insert(newUser, at: 0)
            completed()
        }
}

关键说明

  • 时间戳计算:30 * 24 * 60 * 60是30天对应的秒数,用当前时间戳减去这个值得到30天前的时间点,以此作为查询起点,确保只加载近30天的评论。
  • 查询对象类型:queryOrdered(byChild:)返回的是DatabaseQuery,无需强制转换为DatabaseReference,直接调用observe即可。
  • 监听优化:fetchUser中改用observeSingleEvent(of: .value),避免用户信息变化时重复插入数据到数组中。
  • 单位一致性:确保数据库中userTime字段的时间戳是秒级(和timeIntervalSince1970单位一致),如果数据库存的是毫秒级时间戳,需要将thirtyDaysAgoTimestamp乘以1000再传入queryStarting(atValue:)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:32:42