审查 Combine 框架代码,检测内存泄漏、运算符误用和错误处理。适用于包含 import Combine、AnyPublisher、@Published 等的代码审查。
Issue TypeReferencePublishers, Subjects, AnyPublisherreferences/publishers.mdmap, flatMap, combineLatest, switchToLatestreferences/operators.mdAnyCancellable, retain cycles, [weak self]references/memory.mdtryMap, catch, replaceError, Neverreferences/error-handling.md
sink closures use [weak self] when self owns cancellableassign(to:on:self) usage (use assign(to: &$property) or sink)AnyPublisher via eraseToAnyPublisher()flatMap used correctly (not when map + switchToLatest needed)flatMap to keep main chain alivetryMap followed by mapError to restore error typesreceive(on: DispatchQueue.main) before UI updatesComplete in order. Do not skip ahead while a prior gate is open.
AnyPublisher, @Published, PassthroughSubject). If none apply, stop with “out of scope.”sink, assign, and store(in:) in scope, you state where the AnyCancellable is retained (property, Set, task lifetime) or mark ephemeral with a one-line reason (e.g. synchronous one-shot that cannot outlive caller). If you cannot tell from the snippet, say unknown and ask for surrounding storage, do not assume safe.[weak self], [unowned self], or non-capturing patterns you relied on.receive(on: DispatchQueue.main), @MainActor, or equivalent before the UI work, or flag missing scheduling with file:line.file:line (or exact pasted lines) and names which Review Checklist row it breaks. Lower-severity notes may omit line numbers but must still be reproducible from named files.