|
|
|
|
@ -7,17 +7,17 @@ |
|
|
|
|
|
|
|
|
|
import Foundation |
|
|
|
|
|
|
|
|
|
public protocol Storable : Codable, Identifiable where ID : Hashable { |
|
|
|
|
static var resourceName: String { get } |
|
|
|
|
protocol SomeCollection : Identifiable { |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public class StoredCollection<T : Storable> : RandomAccessCollection, ObservableObject { |
|
|
|
|
public class StoredCollection<T : Storable> : RandomAccessCollection, SomeCollection, ObservableObject { |
|
|
|
|
|
|
|
|
|
let synchronized: Bool |
|
|
|
|
|
|
|
|
|
@Published public fileprivate(set) var items: [T] = [] |
|
|
|
|
|
|
|
|
|
fileprivate var _serviceProvider: ServiceProvider |
|
|
|
|
fileprivate var _store: Store |
|
|
|
|
|
|
|
|
|
fileprivate var _hasChanged: Bool = false { |
|
|
|
|
didSet { |
|
|
|
|
@ -29,9 +29,9 @@ public class StoredCollection<T : Storable> : RandomAccessCollection, Observable |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
init(synchronized: Bool, serviceProvider: ServiceProvider) { |
|
|
|
|
init(synchronized: Bool, store: Store) { |
|
|
|
|
self.synchronized = synchronized |
|
|
|
|
self._serviceProvider = serviceProvider |
|
|
|
|
self._store = store |
|
|
|
|
self._load() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -63,6 +63,12 @@ public class StoredCollection<T : Storable> : RandomAccessCollection, Observable |
|
|
|
|
self._sendDeletionIfNecessary(instance) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public func findById(_ id: String) -> T? { |
|
|
|
|
return self.items.first(where: { $0.id == id }) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// MARK: - File access |
|
|
|
|
|
|
|
|
|
fileprivate func _scheduleWrite() { |
|
|
|
|
self._write() |
|
|
|
|
} |
|
|
|
|
@ -114,13 +120,14 @@ public class StoredCollection<T : Storable> : RandomAccessCollection, Observable |
|
|
|
|
// MARK: - Synchronization |
|
|
|
|
|
|
|
|
|
fileprivate func _sendInsertionIfNecessary(_ instance: T) { |
|
|
|
|
Logger.log("_sendInsertionIfNecessary...") |
|
|
|
|
guard self.synchronized else { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Logger.log("Call service...") |
|
|
|
|
Task { |
|
|
|
|
do { |
|
|
|
|
let _ = try await self._serviceProvider.service?.insert(instance) |
|
|
|
|
let _ = try await self._store.service?.insert(instance) |
|
|
|
|
} catch { |
|
|
|
|
Logger.error(error) |
|
|
|
|
} |
|
|
|
|
@ -135,7 +142,7 @@ public class StoredCollection<T : Storable> : RandomAccessCollection, Observable |
|
|
|
|
|
|
|
|
|
Task { |
|
|
|
|
do { |
|
|
|
|
let _ = try await self._serviceProvider.service?.insert(instance) |
|
|
|
|
let _ = try await self._store.service?.insert(instance) |
|
|
|
|
} catch { |
|
|
|
|
Logger.error(error) |
|
|
|
|
} |
|
|
|
|
@ -150,7 +157,7 @@ public class StoredCollection<T : Storable> : RandomAccessCollection, Observable |
|
|
|
|
|
|
|
|
|
Task { |
|
|
|
|
do { |
|
|
|
|
let _ = try await self._serviceProvider.service?.delete(instance) |
|
|
|
|
let _ = try await self._store.service?.delete(instance) |
|
|
|
|
} catch { |
|
|
|
|
Logger.error(error) |
|
|
|
|
} |
|
|
|
|
|