소스 정보
- 저장소
- aaione/everything-claude-code-zh
- 최근 소스 활동
- 2026년 5월 31일 04:41
- 감지된 SKILL.md 언어
- 중국어
- 스타
- 27
- 포크
- 13
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/aaione/everything-claude-code-zh --skill swift-actor-persistence명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | swift-actor-persistence |
| description | 使用 Swift Actor 实现线程安全的数据持久化 — 带文件备份存储的内存缓存,从设计上消除数据竞争。 |
| origin | ECC |
使用 Swift Actor 构建线程安全数据持久化层的模式。结合内存缓存和文件备份存储,利用 Actor 模型在编译时消除数据竞争。
Actor 模型保证序列化访问 — 没有数据竞争,由编译器强制执行。
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)
// 初始化期间同步加载(Actor 隔离尚未激活)
self.cache = Self.loadSynchronously(from: fileURL)
}
// MARK: - 公共 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 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) })
}
}
由于 Actor 隔离,所有调用自动变为异步:
let repository = LocalRepository<Question>()
// 读取 — 从内存缓存快速 O(1) 查找
let question = await repository.find(by: "q-001")
let allQuestions = await repository.loadAll()
// 写入 — 更新缓存并原子性地持久化到文件
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()
}
}
| 决策 | 理由 |
|---|---|
| Actor(而非类 + 锁) | 编译器强制线程安全,无需手动同步 |
| 内存缓存 + 文件持久化 | 从缓存快速读取,持久写入到磁盘 |
| 同步初始化加载 | 避免异步初始化的复杂性 |
| 以 ID 为键的字典 | O(1) 按标识符查找 |
泛型化 Codable & Identifiable | 可跨任何模型类型复用 |
原子文件写入(.atomic) | 防止崩溃时部分写入 |
Sendable 类型处理所有跨 Actor 边界的数据.atomic 写入以防止应用在写入中途崩溃时的数据损坏init 中同步加载 — 异步初始化器增加复杂性但对本地文件好处不大@Observable ViewModel 结合以实现响应式 UI 更新DispatchQueue 或 NSLock 而非 Actorawait — 调用者必须处理异步上下文nonisolated 绕过 Actor 隔离(违背了目的)DispatchQueue 的传统线程安全方案