保存失败时返回具体错误信息
This commit is contained in:
+16
-5
@@ -21,6 +21,17 @@ struct Clip: Codable, Identifiable, Equatable, Sendable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum ClipStoreError: Error, LocalizedError {
|
||||||
|
case appGroupUnavailable
|
||||||
|
|
||||||
|
var errorDescription: String? {
|
||||||
|
switch self {
|
||||||
|
case .appGroupUnavailable:
|
||||||
|
return "无法访问 App Group 容器,请检查签名和 entitlements 配置。"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
actor ClipStore {
|
actor ClipStore {
|
||||||
|
|
||||||
static let shared = ClipStore()
|
static let shared = ClipStore()
|
||||||
@@ -31,13 +42,13 @@ actor ClipStore {
|
|||||||
|
|
||||||
private var cachedClips: [Clip]?
|
private var cachedClips: [Clip]?
|
||||||
|
|
||||||
private var fileURL: URL {
|
private func fileURL() throws -> URL {
|
||||||
let fileManager = FileManager.default
|
let fileManager = FileManager.default
|
||||||
guard let containerURL = fileManager.containerURL(forSecurityApplicationGroupIdentifier: appGroupIdentifier) else {
|
guard let containerURL = fileManager.containerURL(forSecurityApplicationGroupIdentifier: appGroupIdentifier) else {
|
||||||
fatalError("无法访问 App Group 容器: \(appGroupIdentifier)")
|
throw ClipStoreError.appGroupUnavailable
|
||||||
}
|
}
|
||||||
let directoryURL = containerURL.appendingPathComponent(subdirectory, isDirectory: true)
|
let directoryURL = containerURL.appendingPathComponent(subdirectory, isDirectory: true)
|
||||||
try? fileManager.createDirectory(at: directoryURL, withIntermediateDirectories: true)
|
try fileManager.createDirectory(at: directoryURL, withIntermediateDirectories: true)
|
||||||
return directoryURL.appendingPathComponent(fileName)
|
return directoryURL.appendingPathComponent(fileName)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,7 +66,7 @@ actor ClipStore {
|
|||||||
return cached
|
return cached
|
||||||
}
|
}
|
||||||
|
|
||||||
let url = fileURL
|
let url = try fileURL()
|
||||||
let fileManager = FileManager.default
|
let fileManager = FileManager.default
|
||||||
guard fileManager.fileExists(atPath: url.path) else {
|
guard fileManager.fileExists(atPath: url.path) else {
|
||||||
cachedClips = []
|
cachedClips = []
|
||||||
@@ -93,7 +104,7 @@ actor ClipStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func persist(_ clips: [Clip]) async throws {
|
private func persist(_ clips: [Clip]) async throws {
|
||||||
let url = fileURL
|
let url = try fileURL()
|
||||||
let data = try JSONEncoder().encode(clips)
|
let data = try JSONEncoder().encode(clips)
|
||||||
try data.write(to: url, options: .atomic)
|
try data.write(to: url, options: .atomic)
|
||||||
cachedClips = clips
|
cachedClips = clips
|
||||||
|
|||||||
Reference in New Issue
Block a user