用于线程安全持久化的 Swift Actor
使用 Swift actor 构建线程安全数据持久化层的模式。结合内存缓存与文件支持的存储,利用 actor 模型在编译时消除数据竞争。
何时激活
- 在 Swift 5.5+ 中构建数据持久化层
- 需要对共享可变状态进行线程安全访问
- 希望消除手动同步(锁、DispatchQueue)
- 构建具有本地存储的离线优先应用
核心模式
基于 Actor 的存储库
Actor 模型保证了序列化访问 —— 没有数据竞争,由编译器强制执行。
用法
由于 actor 隔离,所有调用都会自动变为异步:
与 @Observable ViewModel 结合使用
关键设计决策
最佳实践
- 对所有跨越 actor 边界的数据使用
Sendable类型 - 保持 actor 的公共 API 最小化 —— 仅暴露领域操作,而非持久化细节
- 使用
.atomic写入 以防止应用在写入过程中崩溃导致数据损坏 - 在
init中同步加载 —— 异步初始化器会增加复杂性,而对本地文件的益处微乎其微 - 与
@ObservableViewModel 结合使用 以实现响应式 UI 更新
应避免的反模式
- 在 Swift 并发新代码中使用
DispatchQueue或NSLock而非 actor - 将内部缓存字典暴露给外部调用者
- 在不进行验证的情况下使文件 URL 可配置
- 忘记所有 actor 方法调用都是
await—— 调用者必须处理异步上下文 - 使用
nonisolated来绕过 actor 隔离(违背了初衷)
何时使用
- iOS/macOS 应用中的本地数据存储(用户数据、设置、缓存内容)
- 稍后同步到服务器的离线优先架构
- 应用中多个部分并发访问的任何共享可变状态
- 用现代 Swift 并发性替换基于
DispatchQueue的旧式线程安全机制


