@@ -9,47 +9,62 @@ import Foundation
99
1010@MainActor
1111public final class TaskStore {
12+
1213 public static let shared = TaskStore ( )
14+ private init ( ) { load ( ) }
1315
14- public var container : ModelContainer !
15- public var context : ModelContext {
16- container. mainContext
17- }
16+ private let key = " task_progress_store "
1817
19- private init ( ) { }
18+ // taskId -> completedAt
19+ private var completed : [ String : Date ] = [ : ]
2020
21- // 初始化 SwiftData 容器
22- // 外部注入 SwiftData 的 ModelContainer
23- public func setup( container: ModelContainer ) {
24- self . container = container
25- }
21+ // MARK: - Public API
2622
27- // 查询某个 task 用户完成了吗
2823 public func isDone( _ id: String ) -> Bool {
29- let descriptor = FetchDescriptor < TaskProgress > ( predicate: #Predicate { $0. taskId == id } )
30- let result = try ? context. fetch ( descriptor)
31- return result? . first? . isDone ?? false
24+ completed [ id] != nil
25+ }
26+
27+ public func completedAt( _ id: String ) -> Date ? {
28+ completed [ id]
3229 }
3330
34- // 修改某个 task 用户已经完成
3531 public func markDone( _ id: String ) {
36- // 先查询是否存在,存在就更新,不存在就插入
37-
38- let descriptor = FetchDescriptor < TaskProgress > ( predicate: #Predicate { $0. taskId == id } )
39- if let result = try ? context. fetch ( descriptor) , let progress = result. first {
40- progress. isDone = true
41- progress. completedAt = Date ( )
42- } else {
43- // 不存在就插入
44- print ( " 不存在,插入 " )
45- context. insert ( TaskProgress ( taskId: id, isDone: true , completedAt: Date ( ) ) )
46- }
47- do {
48- try context. save ( )
49- } catch {
50- let nsError = error as NSError
51- fatalError ( " 保存失败: \( nsError) , \( nsError. userInfo) " )
32+ guard completed [ id] == nil else { return }
33+ completed [ id] = Date ( )
34+ save ( )
35+ }
36+
37+ public func reset( _ id: String ) {
38+ if completed. removeValue ( forKey: id) != nil {
39+ save ( )
5240 }
41+ }
5342
43+ public func resetAll( ) {
44+ completed. removeAll ( )
45+ save ( )
5446 }
47+
48+ // MARK: - Persistence
49+
50+ private func save( ) {
51+ let data = completed. mapValues { $0. timeIntervalSince1970 }
52+ UserDefaults . standard. set ( data, forKey: key)
53+ }
54+
55+ private func load( ) {
56+ guard
57+ let raw = UserDefaults . standard. dictionary ( forKey: key) as? [ String : TimeInterval ]
58+ else { return }
59+
60+ completed = raw. mapValues { Date ( timeIntervalSince1970: $0) }
61+ }
62+
63+ // 用于从原来的swfitdata方案迁移过来
64+ public func migrateDone( taskId: String , completedAt: Date ) {
65+ guard completed [ taskId] == nil else { return }
66+ completed [ taskId] = completedAt
67+ save ( )
68+ }
69+
5570}
0 commit comments