| name | swift-actor-persistence |
| description | Swift 中使用 actor 实现的线程安全数据持久化 —— 结合内存缓存与文件存储,从设计上消除数据竞争。 |
| origin | ECC |
使用 Swift Actors 实现线程安全持久化 (Swift Actors for Thread-Safe Persistence)
使用 Swift actor 构建线程安全数据持久化层的模式。该模式结合了内存缓存(In-memory caching)与基于文件的存储,利用 actor 模型(Actor model)在编译时消除数据竞争(Data races)。
何时启用
- 在 Swift 5.5+ 中构建数据持久化层
- 需要对共享可变状态(Shared mutable state)进行线程安全访问
- 希望消除手动同步操作(如 locks、DispatchQueues)
- 构建具有本地存储的离线优先(Offline-first)应用
核心模式 (Core Pattern)
基于 Actor 的仓库模式 (Actor-Based Repository)
Actor 模型保证了序列化访问(Serialized access)—— 由编译器强制执行,确保不会出现数据竞争。
public actor LocalRepository<T: Codable & Identifiable> where T.ID == String {
private var cache: [String: T] = [:]
private let fileURL: URL
public init(directory: .documentsDirectory, : ) {
.fileURL directory.appendingPathComponent(filename)
.cache .loadSynchronously(from: fileURL)
}
( : ) {
cache[item.id] item
persistToFile()
}
( : ) {
cache[id]
persistToFile()
}
( : ) -> ? {
cache[id]
}
() -> [] {
(cache.values)
}
() {
data ().encode((cache.values))
data.write(to: fileURL, options: .atomic)
}
( : ) -> [: ] {
data (contentsOf: url),
items ().decode([]., from: data) {
[:]
}
(uniqueKeysWithValues: items.map { (.id, ) })
}
}