帮助 Swift 开发者实现基于 Actor 的线程安全内存与文件持久化方案
该技能材料显示其为开源的 Swift 持久化模式/提示内容,未要求密钥,也未声明任何远程通信;主要能力是本地内存缓存与文件落盘。基于现有材料,整体风险较低,但因涉及本地文件读写,应留意数据落盘位置与内容敏感性。
材料明确标注无需密钥或环境变量,README 示例中也未出现 token、API key 或外部凭证配置,未见明显凭证泄露或滥用面。
已声明无远程端点,提供的代码片段仅进行本地 JSON 编解码与文件读写,未见网络请求、数据上传或向第三方传输用户数据的迹象。
从材料看这是模式说明/示例代码而非会在本机拉起进程的工具;未见执行 shell、启动子进程或调用高权限系统能力的描述。
示例会将数据写入本地 documentsDirectory 下的 data.json,并在初始化时同步读取该文件;这是其声明功能所需的常规本地数据访问,但若用于敏感业务数据,需自行控制存储路径、权限与加密。
来源为 GitHub 开源仓库,且社区采用度很高(约 21 万 star),这些都是降低风险的正面证据;虽然许可证未声明、维护状态未知,且仓库链接与技能名称看起来不完全一致,建议部署前再核对仓库对应关系,但仅凭当前材料未见足以升为高风险的具体红旗。
复制安装指令,让 AI 自动完成配置 · 推荐新手
请帮我安装 askskill 上的 "swift-actor-persistence" 技能: 1. 下载 https://raw.githubusercontent.com/affaan-m/ECC/main/skills/swift-actor-persistence/SKILL.md 2. 保存为 ~/.claude/skills/swift-actor-persistence/SKILL.md 3. 装好后重载技能,告诉我可以用了
请用 Swift 设计一个基于 actor 的本地持久化仓库,包含内存缓存和文件落盘能力,支持保存、读取、删除 Codable 用户设置,并说明如何避免数据竞争。
一套基于 Swift actor 的持久化代码结构,含核心接口、示例实现与线程安全说明。
下面这段 Swift 存储代码在多线程下可能有竞态问题,请将其重构为 actor 模式,并加入内存缓存与文件备份策略,同时保留原有 API 的主要用法。
重构后的 actor 版本代码、迁移说明,以及并发安全性改进点列表。
请为一个使用 actor 的 Swift 持久化模块编写测试方案,覆盖缓存命中、文件读写、并发访问一致性、异常恢复,并给出 XCTest 示例。
包含测试用例清单、并发测试思路与 XCTest 示例代码的完整测试方案。
Patterns for building thread-safe data persistence layers using Swift actors. Combines in-memory caching with file-backed storage, leveraging the actor model to eliminate data races at compile time.
The actor model guarantees serialized access — no data races, enforced by the compiler.
public actor LocalRepository<T: Codable & Identifiable> where T.ID == String {
private var cache: [String: T] = [:]
private let fileURL: URL
public init(directory: URL = .documentsDirectory, filename: String = "data.json") {
self.fileURL = directory.appendingPathComponent(filename)
// Synchronous load during init (actor isolation not yet active)
self.cache = Self.loadSynchronously(from: fileURL)
}
// MARK: - Public API
public func save(_ item: T) throws {
cache[item.id] = item
try persistToFile()
}
public func delete(_ id: String) throws {
cache[id] = nil
try persistToFile()
}
public func find(by id: String) -> T? {
cache[id]
}
public func loadAll() -> [T] {
Array(cache.values)
}
// MARK: - Private
private func persistToFile() throws {
let data = try JSONEncoder().encode(Array(cache.values))
try data.write(to: fileURL, options: .atomic)
}
private static func loadSynchronously(from url: URL) -> [String: T] {
guard let data = try? Data(contentsOf: url),
let items = try? JSONDecoder().decode([T].self, from: data) else {
return [:]
}
return Dictionary(uniqueKeysWithValues: items.map { ($0.id, $0) })
}
}
All calls are automatically async due to actor isolation:
let repository = LocalRepository<Question>()
// Read — fast O(1) lookup from in-memory cache
let question = await repository.find(by: "q-001")
let allQuestions = await repository.loadAll()
// Write — updates cache and persists to file atomically
try await repository.save(newQuestion)
try await repository.delete("q-001")
@Observable
final class QuestionListViewModel {
private(set) var questions: [Question] = []
private let repository: LocalRepository<Question>
init(repository: LocalRepository<Question> = LocalRepository()) {
self.repository = repository
}
func load() async {
questions = await repository.loadAll()
}
func add(_ question: Question) async throws {
try await repository.save(question)
questions = await repository.loadAll()
}
}
| Decision | Rationale |
|---|---|
| Actor (not class + lock) | Compiler-enforced thread safety, no manual synchronization |
| In-memory cache + file persistence | Fast reads from cache, durable writes to disk |
| Synchronous init loading | Avoids async initialization complexity |
| Dictionary keyed by ID | O(1) lookups by identifier |
Generic over Codable & Identifiable | Reusable across any model type |
Atomic file writes (.atomic) | Prevents partial writes on crash |
Sendable types for all data crossing actor boundaries.atomic writes to prevent data corruption if the app crashes mid-writeinit — async initializers add complexity with minimal benefit for local files@Observable ViewModels for reactive UI updates…
基于 C++ Core Guidelines 提供现代、安全、惯用的 C++ 编码规范建议
帮助你设计并实现 F# 单元、属性与集成测试的最佳实践
帮助你用 dmux 编排多智能体并行协作,加速开发与复杂任务执行。
帮助用户检索 PubMed 生物医学文献、MeSH 主题词与 PMID 引文信息。
为 Quarkus 3.x 项目提供测试驱动开发方案,支持功能开发、修复与重构。
通过 fal.ai 一站式生成图片、视频与音频内容,满足多模态创作需求