← ClaudeAtlas

combine-patternslisted

When to activate: Combine framework, publishers, subscribers, sink, flatMap, debounce, merge, PassthroughSubject, CurrentValueSubject
Mattakushi432/Claude-Code-Skills-Custom-DevTools-Pack · ★ 0 · AI & Automation · score 73
Install: claude install-skill Mattakushi432/Claude-Code-Skills-Custom-DevTools-Pack
# Combine Patterns ## Core Concepts ```swift import Combine // Subject — imperative publisher you push values into let subject = PassthroughSubject<String, Never>() // CurrentValueSubject — stores latest value, replays to new subscribers let state = CurrentValueSubject<Bool, Never>(false) // Subscription — always store to prevent cancellation var cancellables = Set<AnyCancellable>() subject .filter { !$0.isEmpty } .map { $0.uppercased() } .sink { print($0) } .store(in: &cancellables) subject.send("hello") // prints "HELLO" ``` ## Search with Debounce ```swift class SearchViewModel: ObservableObject { @Published var query = "" @Published private(set) var results: [Result] = [] private var cancellables = Set<AnyCancellable>() init(service: SearchService) { $query .debounce(for: .milliseconds(300), scheduler: DispatchQueue.main) .removeDuplicates() .filter { $0.count >= 2 } .flatMap { query in Future<[Result], Never> { promise in Task { let r = (try? await service.search(query)) ?? [] promise(.success(r)) } } } .receive(on: DispatchQueue.main) .assign(to: \.results, on: self) .store(in: &cancellables) } } ``` ## Combining Publishers ```swift // zip — pairs elements from two publishers Publishers.Zip(userPublis