We just shipped a 6-month iOS build for a health-tech client, SwiftUI on the front, Combine for state and data flow. Here's a candid post-mortem: what worked, what we'd do again, and what we tore out at week 14. (For the broader SwiftUI-vs-UIKit framing, see our SwiftUI vs UIKit take.)
What worked beautifully
SwiftUI's view composition was a clear win. Onboarding (12 screens), settings (24 rows), and a chat-style activity feed shipped at roughly 2× the velocity of our previous UIKit project. Live previews shortened review cycles from days to hours.
Combine for network → state pipelines was elegant. URLSession.dataTaskPublisher → decode → map → assign(to: &$state). Once the team learned the operators, the code read like the data flow diagram on the whiteboard.
What broke at week 14
Three things:
- Long-running Combine chains became unreadable. Once a pipeline crossed 7-8 operators with branches, it was harder to debug than UIKit callbacks. We refactored heavy ones into
async/awaitwith structured concurrency. - SwiftUI list performance on a 1,200-item feed. Frame drops on scroll. The fix: lazy-loading boundaries with
onAppearwindows, and image caching via Nuke. Worked, but took two weeks. - NavigationStack vs NavigationPath state restoration. Deep linking into a 4-level navigation stack from a push notification was finicky. Solved, but it shouldn't have taken three days.
What we'd do differently
- Default new pipelines to
async/await. Reach for Combine only when we need multi-source merging or replay semantics. - Adopt
@Observable(iOS 17+) on day one if iOS 16 support isn't required. It made@StateObject+@Publishedjuggling go away. - Set a performance budget before writing the feed. We retrofitted it; it should have been front-loaded.
The verdict
Would we use SwiftUI + Combine again? Yes, but more async/await than Combine, and more measurement of scroll performance from day one. The app shipped to 5-star reviews, and we'd absolutely make the same architectural call again. See similar live apps on the mobile portfolio.
See our mobile dev services, hire a SwiftUI engineer, or join the team.