<feed xmlns="http://www.w3.org/2005/Atom"> <id>https://sonjh1217.github.io/</id><title>Soapy's Blog</title><subtitle>Develop reliable services through testing and intuitive experiences for users</subtitle> <updated>2026-06-20T01:28:12+00:00</updated> <author> <name>Soapy</name> <uri>https://sonjh1217.github.io/</uri> </author><link rel="self" type="application/atom+xml" href="https://sonjh1217.github.io/feed.xml"/><link rel="alternate" type="text/html" hreflang="en" href="https://sonjh1217.github.io/"/> <generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator> <rights> © 2026 Soapy </rights> <icon>/assets/img/favicons/favicon.ico</icon> <logo>/assets/img/favicons/favicon-96x96.png</logo> <entry><title>Migrating XIB + MVVM CollectionView Screens to SwiftUI Without Rewriting the Shared Delegate</title><link href="https://sonjh1217.github.io/posts/swiftui-migration-collectionview/" rel="alternate" type="text/html" title="Migrating XIB + MVVM CollectionView Screens to SwiftUI Without Rewriting the Shared Delegate" /><published>2026-06-20T00:00:00+00:00</published> <updated>2026-06-20T00:00:00+00:00</updated> <id>https://sonjh1217.github.io/posts/swiftui-migration-collectionview/</id> <content type="text/html" src="https://sonjh1217.github.io/posts/swiftui-migration-collectionview/" /> <author> <name>Soapy</name> </author> <category term="iOS" /> <category term="SwiftUI" /> <summary>When a codebase already uses xib + MVVM + shared collectionView delegate, the hardest part of SwiftUI migration is usually not SwiftUI itself. It is the shared delegate. The common failure mode is this: the shared delegate starts learning feature-specific details cellForItemAt grows a big switch over use cases the “shared” layer slowly stops being shared If the goal is to support iO...</summary> </entry> <entry><title>Designing an Agentic Flywheel for iOS Development</title><link href="https://sonjh1217.github.io/posts/ios-agentic-flywheel/" rel="alternate" type="text/html" title="Designing an Agentic Flywheel for iOS Development" /><published>2026-04-02T00:00:00+00:00</published> <updated>2026-04-02T15:10:15+00:00</updated> <id>https://sonjh1217.github.io/posts/ios-agentic-flywheel/</id> <content type="text/html" src="https://sonjh1217.github.io/posts/ios-agentic-flywheel/" /> <author> <name>Soapy</name> </author> <category term="iOS" /> <category term="AI" /> <category term="Workflow" /> <summary>My previous post about the agentic flywheel was intentionally generic. This one is the follow-up: how I would design an iOS-development-specific flywheel. The framing still comes from Kief Morris’s article, Humans and Agents in Software Engineering Loops, especially these points: Harness = the collection of specifications, quality checks, and workflow guidance. The loop improves only if...</summary> </entry> <entry><title>When AASA Breaks Universal Link Login</title><link href="https://sonjh1217.github.io/posts/aasa-universal-link-login-incident/" rel="alternate" type="text/html" title="When AASA Breaks Universal Link Login" /><published>2026-04-01T00:00:00+00:00</published> <updated>2026-04-02T14:07:23+00:00</updated> <id>https://sonjh1217.github.io/posts/aasa-universal-link-login-incident/</id> <content type="text/html" src="https://sonjh1217.github.io/posts/aasa-universal-link-login-incident/" /> <author> <name>Soapy</name> </author> <category term="iOS" /> <category term="Troubleshooting" /> <summary>Symptoms The login with other app success rate drops. The gap between login attempts and (success + failure) grows. That gap can mean more users are starting login but never reaching a completion event. If the product supports login via another app, it is worth checking whether the redirect back to the app is broken. Possible Cause If the return path after external-app login dep...</summary> </entry> <entry><title>Building an Agentic Flywheel</title><link href="https://sonjh1217.github.io/posts/agentic-flywheel/" rel="alternate" type="text/html" title="Building an Agentic Flywheel" /><published>2026-04-01T00:00:00+00:00</published> <updated>2026-04-01T15:33:14+00:00</updated> <id>https://sonjh1217.github.io/posts/agentic-flywheel/</id> <content type="text/html" src="https://sonjh1217.github.io/posts/agentic-flywheel/" /> <author> <name>Soapy</name> </author> <category term="AI" /> <category term="Workflow" /> <summary>I have been thinking a lot about what kind of environment makes AI agents improve over time instead of just producing one-off outputs. More specifically, I wanted to build an environment that could support what Kief Morris calls the agentic flywheel. The framing that helped me most came from Kief Morris’s article, Humans and Agents in Software Engineering Loops. In that piece, he argues that ...</summary> </entry> <entry><title>Testing DispatchQueue-Based Code Without Waiting</title><link href="https://sonjh1217.github.io/posts/test-dispatch/" rel="alternate" type="text/html" title="Testing DispatchQueue-Based Code Without Waiting" /><published>2025-12-28T00:00:00+00:00</published> <updated>2026-01-15T15:39:15+00:00</updated> <id>https://sonjh1217.github.io/posts/test-dispatch/</id> <content type="text/html" src="https://sonjh1217.github.io/posts/test-dispatch/" /> <author> <name>Soapy</name> </author> <category term="Test" /> <summary>A Pragmatic, TDD-First Approach I used to write async tests using XCTestExpectation and wait(for:timeout:). That approach works, and I’ve shipped production code with it. But once you adopt TDD seriously and start adding a large number of tests, even very small waits become a real cost. A 0.1-second wait looks harmless in isolation, but in practice it multiplies: hundreds or thousands of...</summary> </entry> </feed>
