Apps are full of things that happen over time: a user types into a search field, a network request finishes, a timer fires, a setting changes. Combine, introduced in iOS 13, gives you one consistent way to handle all of them. Values flow from publishers through a chain of operators to subscribers, and you describe that pipeline declaratively instead of juggling callbacks.

Since Swift 5.5, async/await and AsyncSequence cover many of the same jobs, and since iOS 17 the Observation framework handles most SwiftUI data flow. Combine is still fully supported, though, and you’ll find it in a huge number of codebases, especially those built between 2019 and 2023.

Each article measures the behavior it describes and ends with an exercise. The examples use Swift 6 language mode and were compiled and run with the Swift 6.4 toolchain from Xcode 27.1 on macOS 26, so they also show where Combine, a framework compiled without strict concurrency checking, meets Swift 6’s actor isolation: which closures crash when a publisher delivers on a background thread, and how to write pipelines that do not. Time-based behavior is pinned down with a virtual-time scheduler defined in the time operators article, the networking examples run against the loopback server from the networking roadmap, the testing article is a Swift package run with swift test, and the SwiftUI comparisons count body evaluations in hosted views.

Article available Coming soon

1. The Core Ideas

2. Operators

3. Real-World Combine

Timers

Foundation’s Timer gained a Combine face in iOS 13: Timer.publish(every:on:in:) returns a publisher that emits the current Date on each tick. It...

4. Doing It Right

5. Combine Today

Up next

RxSwift

This guide grows with the blog: new articles are linked here as soon as they're published. Missing something? Let me know.

← Back to all roadmaps