@@ -12,9 +12,11 @@ import FetchRequests
1212
1313enum ModelError : Error {
1414 case invalidDate
15- case cannotInflate
1615}
1716
17+ private let encoder = JSONEncoder ( )
18+ private let decoder = JSONDecoder ( )
19+
1820// MARK: - Event Notifications
1921
2022extension Model {
@@ -45,24 +47,22 @@ extension Model {
4547 return UserDefaults . standard. dictionary ( forKey: key) ?? [ : ]
4648 }
4749
48- fileprivate class func updateStorage( _ block: ( inout [ String : Any ] ) -> Void ) {
50+ fileprivate class func updateStorage( _ block: ( inout [ String : Any ] ) throws -> Void ) rethrows {
4951 assert ( Thread . isMainThread)
5052
5153 let defaults = UserDefaults . standard
5254 let key = NSStringFromClass ( self )
5355
5456 var storage = defaults. dictionary ( forKey: key) ?? [ : ]
55- block ( & storage)
57+ try block ( & storage)
5658 defaults. set ( storage, forKey: key)
5759 }
5860
5961 private class func validateCanUpdate( _ originalModel: Model ) throws -> Model {
60- var data = originalModel. data. dictionary ?? [ : ]
61- data [ " updatedAt " ] = Date ( ) . timeIntervalSince1970
62+ var data = originalModel. data
63+ data. updatedAt = Date ( )
6264
63- guard let json = JSON ( data) , let model = self . init ( data: json) else {
64- throw ModelError . cannotInflate
65- }
65+ let model = Model ( data: data)
6666
6767 guard model. createdAt != . distantPast else {
6868 throw ModelError . invalidDate
@@ -73,8 +73,8 @@ extension Model {
7373 return model
7474 }
7575 guard existing. updatedAt <= model. updatedAt,
76- existing. createdAt == model. createdAt else
77- {
76+ existing. createdAt == model. createdAt
77+ else {
7878 throw ModelError . invalidDate
7979 }
8080
@@ -85,8 +85,9 @@ extension Model {
8585 class func save( _ originalModel: Model ) throws {
8686 let model = try validateCanUpdate ( originalModel)
8787
88- updateStorage {
89- $0 [ model. id] = model. data. object
88+ try updateStorage {
89+ let data = try encoder. encode ( model. data)
90+ $0 [ model. id] = data
9091 }
9192
9293 NotificationCenter . default. post (
@@ -124,17 +125,21 @@ extension Model {
124125
125126extension NSObjectProtocol where Self: Model {
126127 static func fetchAll( ) -> [ Self ] {
127- return storage. values. lazy. compactMap {
128- Self . RawData ( $0)
129- } . compactMap {
128+ return storage. values. lazy. compactMap { value in
129+ value as? Data
130+ } . compactMap { data in
131+ try ? decoder. decode ( Model . RawData. self, from: data)
132+ } . map {
130133 Self ( data: $0)
131134 }
132135 }
133136
134137 static func fetch( byID id: Model . ID ) -> Self ? {
135- return storage [ id] . flatMap {
136- Self . RawData ( $0)
137- } . flatMap {
138+ return storage [ id] . flatMap { value in
139+ value as? Data
140+ } . flatMap { data in
141+ try ? decoder. decode ( Model . RawData. self, from: data)
142+ } . map {
138143 Self ( data: $0)
139144 }
140145 }
0 commit comments