Mobile

Why We Bet on SwiftUI + Combine for Our Latest iOS App (And What Broke)

HK Infoway Team · · 6 min read
SwiftUI Combine production app architecture

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/await with structured concurrency.
  • SwiftUI list performance on a 1,200-item feed. Frame drops on scroll. The fix: lazy-loading boundaries with onAppear windows, 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

  1. Default new pipelines to async/await. Reach for Combine only when we need multi-source merging or replay semantics.
  2. Adopt @Observable (iOS 17+) on day one if iOS 16 support isn't required. It made @StateObject + @Published juggling go away.
  3. 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.

Tagged iOS SwiftUI Combine Post-mortem

Liked this? Let's build something worth writing about.

Start a project →