SwiftUI Fundamentals

Series Recap: What We've Covered

July 3, 2026
4 min read
Featured image for blog post: Series Recap: What We've Covered

We've covered a lot of ground. Here's a quick reference of everything in this series.

Follow along with the code: iOS-Practice on GitHub

Concurrency Deep Dive

GCD & Threading

  • Race conditions and serial queues
  • Thread-safe collections
  • Main thread violations
  • DispatchQueue.main vs @MainActor
  • Deadlocks: sync to same queue
  • Lock ordering

Async/Await

  • Task cancellation (cooperative)
  • Debounced search
  • Actor reentrancy
  • Safe financial systems with actors
  • Unstructured task leaks
  • Structured vs unstructured concurrency

Combine

  • Retain cycles with [weak self]
  • Timer subscriptions
  • Missing cancellables
  • Multiple subscription management

Testing Mastery

Dependency Injection

  • Refactoring singletons
  • Protocol-based DI
  • Decoupling network code
  • Mock HTTP clients
  • Testing time-dependent code
  • DateProviding pattern

Side Effects

  • Testing UserDefaults
  • InMemoryKeyValueStore
  • Abstracting file system
  • In-memory file systems

Architecture & Mocking

  • Testing ViewModels with @Published
  • Repository pattern
  • Mock vs Stub vs Fake vs Spy
  • Spy mocks for interaction verification
  • Testable service layers

Async Testing

  • Testing async/await methods
  • Testing TaskGroup operations
  • Cache behavior testing
  • Actor isolation in tests

SwiftUI Patterns

Lists & Data Loading

  • Loading and error states
  • ContentUnavailableView
  • Pull-to-refresh
  • Relative dates
  • Search with debouncing
  • Multi-filter lists

Grids & Layouts

  • LazyVGrid photo galleries
  • Sheet-based detail views
  • Adaptive grids
  • Grid/list mode transitions

Navigation

  • NavigationStack master-detail
  • Value-based NavigationLink
  • Modal presentations
  • Confirmation dialogs
  • Swipe actions
  • Passing data from modals

State Management

  • Form validation
  • Password strength indicators
  • @StateObject vs @ObservedObject
  • Shopping cart with EnvironmentObject

Key Patterns Summary

TopicKey Pattern
Thread safetySerial queues or actors
CancellationCooperative checking
TestingProtocol + mock injection
State@StateObject owns, @ObservedObject receives
NavigationValue-based NavigationLink
ListsLoading/success/empty/error states

What's Next

The final two posts cover setting up the practice projects and resources for continued learning.

Originally published on pixelper.com

© 2026 Christopher Moore / Dead Pixel Studio

Let's work together

Professional discovery, design, and complete technical coverage for your ideas

Get in touch