Swift接入Firebase RTD时间戳过期判断逻辑异常问题求助
问题核心原因
两个版本的代码都存在逻辑缺陷,和格式无关:
- 第一版判断条件为
postTime > postTime + cutTime:任意数值加上正的阈值cutTime必然大于自身,所以该判断永远为false,永远输出not delete - 第二版判断条件为
postTime < postTime + cutTime:和上面的逻辑完全相反,该判断永远为true,所以会立刻触发delete逻辑
两个版本的共同问题是完全没有引入当前时间做对比,仅用帖子发布时间自身做运算,不可能得到正确的过期判定结果。
正确实现逻辑
首先要获取当前系统的毫秒级时间戳,和Firebase返回的帖子时间戳单位对齐后再做判断:
- 单位对齐:Firebase RTD的默认时间戳为毫秒级,Swift原生
Date()的timeIntervalSince1970为秒级,需要乘以1000转换单位 - 判断逻辑:当前时间 > 帖子发布时间 + 过期阈值时,触发删除操作
正确代码示例:
let postFinally = Posts(timeStamp: timeStamp as! Double?) // 过期阈值:1分钟,单位为毫秒 let cutTime = 1.0 * 60.0 * 1000.0 // 安全解包时间戳,避免强转崩溃 guard let postTime = postFinally.timeStamp as? Double else { print("时间戳格式错误") return } // 获取当前毫秒级时间戳 let currentTime = Date().timeIntervalSince1970 * 1000 if currentTime > postTime + cutTime { print("delete") // 这里补充Firebase删除对应帖子的逻辑 } else { print("not delete") }
如果需要调整为1小时过期,仅需要把cutTime改为1.0 * 60.0 * 60.0 * 1000.0即可。
额外优化建议
- 建议不要使用
as!强转类型,改用if let/guard let安全解包,避免服务端返回异常数据时App崩溃 - 自动删除逻辑建议优先放在Firebase云函数中触发,客户端侧的判断仅做展示层过滤,避免用户修改本地时间绕过过期规则
内容的提问来源于stack exchange,提问作者noobcoderSwift
相关产品推荐
相关产品推荐

