Articles Projects About Subscribe
← All issues Newsletter

iOS Dev Weekly — Issue #51

Opening

SwiftUI’s new Observation model is powerful, but production apps are discovering where “reactive by default” collides with scrolling performance and ownership boundaries. The Simulator can hide the problem; device profiles don’t. This week is about choosing models that keep invalidations local and frames steady.


This Week’s Big Story

MVVM or Observable? Choosing for Production SwiftUI

When a single observable object has multiple ancestors, you can end up subscribing half your tree without meaning to. The result is jittery feeds, surprising body re-renders, and the sense that “SwiftUI is slow” when the real issue is ownership. If you’re weighing MVVM façades against @Observable in 2026-era SwiftUI, this piece walks through the trade-offs and how to instrument your way to a choice you can ship.


Trend Signals

• Command & Conquer Generals getting a native port to macOS, iPhone, and iPad hints at a continued appetite for serious game code crossing Apple platforms without middleware tax. [Source: HackerNews]

• Swift.org’s June 2026 digest underscores the pace of language and tooling work post-WWDC—teams should budget upgrade time, not just adopt features opportunistically. [Source: Swift.org Blog]

• Flutter 3.44’s momentum is real, and iOS teams at mixed shops will be asked to compare; keep your SwiftUI story crisp on maintainability and platform fit. [Source: Medium]

• Apple Silicon CocoaPods headaches persist in polyglot stacks; this write-up offers cleaner fixes than shell aliases, worth bookmarking for onboarding docs. [Source: dev.to]

• “defer” is still underused in modern Swift—reintroduce it for tear-down correctness in async paths and complex view/action lifecycles. [Source: SwiftLee (Antoine van der Lee)]


Swift Snippet of the Week

import SwiftUI
import Observation
import OSLog

// ❌ Before — a single shared model instance was retained by multiple ancestors.
// Any property change fanned out invalidations across distant views, spiking
// body evaluations during fast scroll on device.

// ✅ After — scope the observable to a single owner; pass value types downward.
// Rows render from immutable item values and mutate via intents to avoid
// cross-tree observation fans.

struct Item: Identifiable, Hashable {
    let id: UUID
    var title: String
    var isLiked: Bool
}

@MainActor
@Observable
final class FeedModel {
    private let signposter = OSSignposter(subsystem: "Feed", category: "Model")
    var items: [Item] = []
    func load() async {
        let state = signposter.beginInterval("load")
// … (truncated for newsletter)

This pattern encodes a production rule of thumb: give every @Observable a single owner and send value types downward so invalidations remain local and your hottest view paths stay deterministic on device.


Community Picks

Command and Conquer Generals natively ported to macOS, iPhone, iPad using Fable — A reminder that native ports across Apple platforms are viable with discipline and a clear abstraction strategy.

Flutter 3.44 Feels Like the Future — If your org mixes stacks, this is the pitch your PMs will read; be ready with your SwiftUI counterpoints.

How to Fix Apple Silicon CocoaPods Errors Without Messy Terminal Aliases — Practical CocoaPods hygiene for Apple Silicon that you can drop into setup docs today.


Until Next Time

If you’ve seen scroll hitching that mysteriously vanishes in Simulator, the full article digs into ownership, invalidation scope, and device-first profiling that actually fixes it. Read it, try the instrumentation steps, and then hit reply—tell me where your render waves surprised you. Forward this to a teammate wrestling with SwiftUI migrations, and join the conversation on LinkedIn to compare notes from the field.