初识 The Composable Architecture(二)
本文延续上一节对 TCA 的建模思路,聚焦「副作用」该如何在 reducer 中显式表达与测试。我们会把原本隐式的 I/O 操作抽象为 Effect,让 reducer 返回副作用,并进一步调整 combine/pullback 以支持一组 effect 的组合。通过 Favorite Primes 的保存/读取示例,展示从「纯函数」到「可追踪副作用」的演化过程。
本文延续上一节对 TCA 的建模思路,聚焦「副作用」该如何在 reducer 中显式表达与测试。我们会把原本隐式的 I/O 操作抽象为 Effect,让 reducer 返回副作用,并进一步调整 combine/pullback 以支持一组 effect 的组合。通过 Favorite Primes 的保存/读取示例,展示从「纯函数」到「可追踪副作用」的演化过程。
1 | public enum CounterAction { |
上面的代码是个标准的 reducer 结构:当收到 incrTapped 时,修改全局状态(计数加一),再返回新的全局状态。为什么称这样的结构为 reducer?
工作项目用了 Socket.IO 来做客户端与服务端的实时通信,我看了 Socket.IO 是基于 WebSocket 协议进一步封装的。于是,我希望通过实现 WebSocket 客户端 的 一小部分 功能,以达到了解 WebSocket 协议的目标!
前阵子遇到一个很奇怪的 BUG:用 NavigationStack push 一个 View,CPU 使用率竟然冲上 100%!当 Xcode 运行一段 SwiftUI 代码时,我们应该关注哪些方面?特此回顾 WWDC 21 Demystify SwiftUI。
在 Swift 中,协议是非常重要的部分之一。使用协议,可以让我们写出灵活的代码,而不必拘泥于接口和实现的耦合,但协议也有自己的问题。
阅读 Alamofire 5.9.1 版本的源代码,有些收获,记录于此。
本文为 Raywenderlich 出版的《Expert Swift》第 8 章节《Codable》阅读笔记。
除了 Xcode Cloud,你还有别的选择。
最近想了解如何设计一个简单的缓存系统,于是找了 Kingfisher 7.1.2 版本的源代码读一读,有些收获,记录于此。