001project_wildgrowth/ios/WildGrowth/COMPLETION_Y2K版_FRC_审查报告.md

3.1 KiB
Raw Blame History

CompletionView Y2K 版 — 最终候选版 (FRC) 审查报告(不应用)

审查日期2025-01-29
范围Y2K Final Release Candidate含持久化 Key 回滚 + 游客短路逻辑补全)
结论:仅审查、不修改仓库;两项修复已正确落实,可视为可发布候选。


1. 持久化 Key 回滚

项目 要求 FRC 实现 结论
storageKey 与现版一致,沿用 has_revealed_course_\(courseId) private var storageKey: String { "has_revealed_course_\(courseId)" } 正确

从拍立得版本升级到 Y2K 后,已显影过的课程会直接显示结果,无需再次点击 SYNC。


2. 游客短路逻辑

项目 要求 FRC 实现 结论
是否调网络 游客不调 fetchUserProfile if userManager.isGuest { ... return } 先判断,仅主线程延迟后 finalizeSync() 不调接口
视觉延迟 极短“假连接”(你要求 0.5s DispatchQueue.main.asyncAfter(deadline: .now() + 0.6) { finalizeSync() }0.6s 实现合理;若需严格 0.5s 可将 0.6 改为 0.5
结果与持久化 直接成功并写 Key finalizeSync()isSystemOn = trueUserDefaults.set(true, forKey: storageKey)、触觉反馈 一致

游客路径:点击 → isBooting = true → 0.6s 后主线程执行 finalizeSync() → 显影 + 写 Key + 成功反馈,无任何网络请求。


3. 登录用户路径

  • Task.sleep(1.2s)fetchUserProfile()catch 忽略)→ MainActor.run { finalizeSync() }
  • 与现版“拉取后显影”一致,无变更。

4. 结构与线程安全

项目 说明
finalizeSync() 集中处理显影 + 写 Key + isBooting = false + 触觉,避免重复;仅从主线程/主队列调用(DispatchQueue.main.asyncAfterMainActor.run),对 @State 的更新安全。
SpeakerGrill(rotation:) 抽取为 private func SpeakerGrill(rotation: Double) -> some View,在 body 中调用合法,无问题。

5. 可选小修正(非必须)

  • 延迟时长需求写“0.5s 假连接”,代码为 0.6s;若需严格一致,可将 deadline: .now() + 0.6 改为 0.5
  • ForEach:若当前 Swift/SwiftUI 版本对 ForEach(0..<n) 报错或告警,可为 ForEach(0..<3, id: \.self)ForEach(0..<5, id: \.self)ForEach(0..<80, id: \.self) 补上 id: \.self

6. 总结

维度 结论
持久化 Key 已回滚为 has_revealed_course_\(courseId),与现版兼容
游客短路 已补全:不调网络、短延迟后直接 finalizeSync()
登录用户 行为与现版一致
接口与调用方 三参数不变,仅替换 CompletionView.swift 即可
其他页面 无影响

审查结论FRC 已正确落实“Key 回滚”与“游客短路”两项建议,逻辑与现版对齐,可作为最终发布候选。本次未对仓库做任何修改。