关于 combine-code-review
combine-code-review 是面向使用 Swift Combine 的代码审查技能,供审查 Combine 代码的开发者使用。它聚焦订阅生命周期、内存引用、操作符、错误处理和 UI 线程,并设置报告问题前的核验门槛。
主要功能
- 01检查订阅与 AnyCancellable 保留
- 02识别闭包中的循环引用风险
- 03核对发布者操作符用法
- 04审查错误处理链
- 05检查 UI 更新的主线程调度
适用场景
- 01审查 sink 与 assign 的生命周期管理
- 02排查 Combine 链中的潜在内存问题
- 03检查搜索流的 flatMap 与 switchToLatest 选择
- 04核对 UI 发布者链的线程调度
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ existential-birds/ beagle --skill combine-code-review安装后在 Claude Code 中输入/combine-code-review确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/error-handling.mdmemory.mdoperators.mdpublishers.md详细介绍
Combine 代码审查
快速参考
| 问题类型 | 参考资料 |
|---|---|
| Publishers、Subjects、AnyPublisher | references/publishers.md |
| map、flatMap、combineLatest、switchToLatest | references/operators.md |
| AnyCancellable、保留循环、[weak self] | references/memory.md |
| tryMap、catch、replaceError、Never | references/error-handling.md |
审查清单
- 当 self 持有 cancellable 时,所有
sink闭包都使用[weak self] - 不使用
assign(to:on:self)(使用assign(to: &$property)或 sink) - 所有 AnyCancellables 都存储在 Set 或属性中(而非直接丢弃)
- Subjects 通过
eraseToAnyPublisher()以AnyPublisher的形式公开 - 正确使用
flatMap(不在需要map + switchToLatest时使用) - 在
flatMap内处理错误,以保持主链继续运行 -
tryMap后接mapError,以还原错误类型 - 在更新 UI 前使用
receive(on: DispatchQueue.main) - 事件使用 PassthroughSubject,状态使用 CurrentValueSubject
- 使用 retry 时,将 Future 包装在 Deferred 中
何时加载参考资料
- 审查 Subjects 或 publisher 的选择 → publishers.md
- 审查操作符链或组合 publishers → operators.md
- 审查订阅或内存问题 → memory.md
- 审查错误处理或 try* 操作符 → error-handling.md
硬性关卡(报告问题前必须通过)
按顺序完成。前一个关卡尚未通过时,不要跳到后续关卡。
- 范围 — 通过: 至少指出一个正在审查且导入 Combine 或使用快速参考中 API 的文件或类型(例如
AnyPublisher、@Published、PassthroughSubject)。如果均不适用,则以“超出范围”结束。 - 订阅保留 — 通过: 对范围内的每个
sink、assign和store(in:),说明AnyCancellable保留在哪里(属性、Set、任务生命周期),或标记为 临时 并用一句话说明原因(例如无法超出调用方生命周期的同步一次性操作)。如果无法从代码片段判断,请说明 未知 并询问周边的存储代码,不要假定安全。 - 保留循环结论 — 通过: 对于已确认的泄漏问题,说明捕获链(例如 self → 已存储的 cancellable → 强引用 self 的闭包)。对疑似情况标记为 风险 / 待验证,不要说成已确认泄漏。论证安全时,引用所依据的
[weak self]、[unowned self]或无捕获模式。 - UI / 主线程 — 通过: 对于链中对 UIKit/SwiftUI 的更新,指出 UI 操作前的
receive(on: DispatchQueue.main)、@MainActor或等效机制;或者使用file:line标出缺少调度的问题。 - 严重程度和清单 — 通过: 每个 高 或 严重 项都包含
file:line(或精确引用的代码行),并指出违反了 审查清单 中的哪一项。低严重程度的备注可以省略行号,但仍必须能从指定文件中复现。
审查问题
- 是否保留了所有订阅?(检查是否丢弃了 AnyCancellables)
- 是否有
sink或assign可能与 self 形成保留循环? - 搜索或自动补全场景中,
flatMap是否应改为 switchToLatest? - publisher 失败时会发生什么?(会导致主链终止吗?)
try*操作符之后,错误类型是否得到保留或正确映射?
评论
支持 Markdown