<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Zixi Yang · Writing</title>
    <link>https://young027.com/blog/</link>
    <atom:link href="https://young027.com/feed.xml" rel="self" type="application/rss+xml"/>
    <description>Notes by Zixi Yang on iOS engineering, architecture, performance, and building products.</description>
    <language>en</language>
    <lastBuildDate>Sun, 23 Aug 2026 00:00:00 GMT</lastBuildDate>
    <item>
      <title>Cross-Team Collaboration Is Cross-Process Communication</title>
      <link>https://young027.com/blog/2b2456a1/</link>
      <guid isPermaLink="true">https://young027.com/blog/2b2456a1/</guid>
      <pubDate>Tue, 10 Nov 2020 00:00:00 GMT</pubDate>
      <dc:creator>Zixi Yang</dc:creator>
      <description>Designing a sync-publish share SDK between two apps, and what passing an identifier instead of a file taught me about working across teams</description>
      <category>Swift</category>
      <category>PhotoKit</category>
      <category>Architecture</category>
    </item>
    <item>
      <title>A Year After WWDC 2019: Putting Property Wrappers into Production</title>
      <link>https://young027.com/blog/09db3ee0/</link>
      <guid isPermaLink="true">https://young027.com/blog/09db3ee0/</guid>
      <pubDate>Tue, 16 Jun 2020 00:00:00 GMT</pubDate>
      <dc:creator>Zixi Yang</dc:creator>
      <description>Wrapping per-target branding differences behind a Swift 5.1 property wrapper so business code stops reading build configuration</description>
      <category>Swift</category>
      <category>Architecture</category>
    </item>
    <item>
      <title>Designing the Native Bridge for a Collaborative Web Editor</title>
      <link>https://young027.com/blog/4939586e/</link>
      <guid isPermaLink="true">https://young027.com/blog/4939586e/</guid>
      <pubDate>Mon, 10 Feb 2020 00:00:00 GMT</pubDate>
      <dc:creator>Zixi Yang</dc:creator>
      <description>How we treated the JavaScript bridge as a protocol boundary between an iOS SDK and a real-time document engine</description>
      <category>Swift</category>
      <category>WebKit</category>
      <category>Architecture</category>
    </item>
    <item>
      <title>Why We Chose Swinject for a Document SDK</title>
      <link>https://young027.com/blog/228847f0/</link>
      <guid isPermaLink="true">https://young027.com/blog/228847f0/</guid>
      <pubDate>Mon, 20 Jan 2020 00:00:00 GMT</pubDate>
      <dc:creator>Zixi Yang</dc:creator>
      <description>Why a Document SDK adopted Swinject: assemblies for module ownership, scopes that follow account and document lifetimes, and offline as a composition.</description>
      <category>Swift</category>
      <category>Dependency Injection</category>
      <category>Architecture</category>
    </item>
    <item>
      <title>Why We Replaced IGListKit with UICollectionView</title>
      <link>https://young027.com/blog/242a6725/</link>
      <guid isPermaLink="true">https://young027.com/blog/242a6725/</guid>
      <pubDate>Thu, 02 Jan 2020 00:00:00 GMT</pubDate>
      <dc:creator>Zixi Yang</dc:creator>
      <description>A reflection on moving a complex document feed back to native UIKit after iOS 13 introduced diffable data sources and compositional layout</description>
      <category>Swift</category>
      <category>UIKit</category>
      <category>Architecture</category>
    </item>
    <item>
      <title>Taming a Complex Document Feed with ReSwift</title>
      <link>https://young027.com/blog/4b4dc9e9/</link>
      <guid isPermaLink="true">https://young027.com/blog/4b4dc9e9/</guid>
      <pubDate>Tue, 01 Oct 2019 00:00:00 GMT</pubDate>
      <dc:creator>Zixi Yang</dc:creator>
      <description>How ReSwift and unidirectional data flow gave a document feed one authoritative state for filtering, metadata updates, caching, and networking.</description>
      <category>Swift</category>
      <category>State Management</category>
      <category>Architecture</category>
    </item>
    <item>
      <title>One Page, Two Table Views, Three Loaders</title>
      <link>https://young027.com/blog/ea757f4b/</link>
      <guid isPermaLink="true">https://young027.com/blog/ea757f4b/</guid>
      <pubDate>Tue, 06 Aug 2019 00:00:00 GMT</pubDate>
      <dc:creator>Zixi Yang</dc:creator>
      <description>Coordinating gesture handoff in a nested table view and prioritizing three competing data loads on a banner-plus-content page</description>
      <category>Swift</category>
      <category>UIKit</category>
    </item>
    <item>
      <title>Designing Composable Document Permissions with Swift OptionSet</title>
      <link>https://young027.com/blog/57c0fc5b/</link>
      <guid isPermaLink="true">https://young027.com/blog/57c0fc5b/</guid>
      <pubDate>Fri, 02 Aug 2019 00:00:00 GMT</pubDate>
      <dc:creator>Zixi Yang</dc:creator>
      <description>Modeling read, edit, and link sharing as composable Swift OptionSet capabilities, resolved from grants, folder inheritance, denials, and account policy.</description>
      <category>Swift</category>
      <category>Architecture</category>
    </item>
    <item>
      <title>Implementing an LRU Cache</title>
      <link>https://young027.com/blog/53774d2d/</link>
      <guid isPermaLink="true">https://young027.com/blog/53774d2d/</guid>
      <pubDate>Thu, 21 Mar 2019 00:00:00 GMT</pubDate>
      <dc:creator>Zixi Yang</dc:creator>
      <description>How least-recently-used eviction works, why it needs a doubly linked list plus a hash map, and a complete C++ LRU cache built on std::list.</description>
      <category>Algorithms</category>
    </item>
    <item>
      <title>Tracing a Request Through AFNetworking 3.x</title>
      <link>https://young027.com/blog/df7486d3/</link>
      <guid isPermaLink="true">https://young027.com/blog/df7486d3/</guid>
      <pubDate>Tue, 19 Mar 2019 00:00:00 GMT</pubDate>
      <dc:creator>Zixi Yang</dc:creator>
      <description>Following one GET request through AFNetworking 3.2.1, from request serialization to per-task delegates, and how to design a networking layer around it.</description>
      <category>Objective-C</category>
      <category>Networking</category>
      <category>Architecture</category>
    </item>
    <item>
      <title>Objective-C Categories and Class Extensions</title>
      <link>https://young027.com/blog/67f1730e/</link>
      <guid isPermaLink="true">https://young027.com/blog/67f1730e/</guid>
      <pubDate>Sun, 20 Jan 2019 00:00:00 GMT</pubDate>
      <dc:creator>Zixi Yang</dc:creator>
      <description>How Objective-C categories attach methods at runtime and rely on associated objects for storage, while class extensions compile into the class itself.</description>
      <category>Objective-C</category>
      <category>Runtime</category>
    </item>
    <item>
      <title>Rebuilding UITableView Cell Reuse from Zero</title>
      <link>https://young027.com/blog/1898b14b/</link>
      <guid isPermaLink="true">https://young027.com/blog/1898b14b/</guid>
      <pubDate>Sat, 20 Oct 2018 00:00:00 GMT</pubDate>
      <dc:creator>Zixi Yang</dc:creator>
      <description>Deriving the reuse pool from first principles, then implementing a minimal one in sixty lines of Swift</description>
      <category>Swift</category>
      <category>UIKit</category>
    </item>
    <item>
      <title>Understanding the Objective-C Runtime</title>
      <link>https://young027.com/blog/0b13af02/</link>
      <guid isPermaLink="true">https://young027.com/blog/0b13af02/</guid>
      <pubDate>Fri, 05 Oct 2018 00:00:00 GMT</pubDate>
      <dc:creator>Zixi Yang</dc:creator>
      <description>How Objective-C message sending works: isa, classes and metaclasses, selectors, IMPs, method caches, and the three stages of message forwarding.</description>
      <category>Objective-C</category>
      <category>Runtime</category>
    </item>
  </channel>
</rss>
