multistore
Laurent 2 years ago
parent 239a47e17b
commit 2a5a6e6c48
  1. 1
      LeStorage/Store.swift
  2. 57
      LeStorage/StoredCollection.swift

@ -165,6 +165,7 @@ public class Store {
/// Registers an api call into its collection
func registerApiCall<T : Storable>(_ apiCall: ApiCall<T>) throws {
let collection: StoredCollection<ApiCall<T>> = try self.apiCallCollection()
if let existingDataCall = collection.first(where: { $0.dataId == apiCall.dataId }) {

@ -23,11 +23,7 @@ public class StoredCollection<T : Storable> : RandomAccessCollection, SomeCollec
let synchronized: Bool
/// The list of stored items
@Published public fileprivate(set) var items: [T] = [] {
didSet {
self._hasChanged = true
}
}
@Published public fileprivate(set) var items: [T] = []
/// The reference to the Store
fileprivate var _store: Store
@ -109,7 +105,7 @@ public class StoredCollection<T : Storable> : RandomAccessCollection, SomeCollec
/// Updates the whole index with the items array
fileprivate func _updateIndexIfNecessary() {
if let index = self._index {
if let _ = self._index {
self._index = self.items.dictionary(handler: { $0.stringId })
}
}
@ -122,6 +118,7 @@ public class StoredCollection<T : Storable> : RandomAccessCollection, SomeCollec
Task {
do {
self.items = try await self._store.getItems()
self._hasChanged = true
} catch {
Logger.error(error)
}
@ -133,32 +130,38 @@ public class StoredCollection<T : Storable> : RandomAccessCollection, SomeCollec
/// Adds or updates the provided instance inside the collection
/// Adds it if its id is not found, and otherwise updates it
public func addOrUpdate(instance: T) {
defer {
self._hasChanged = true
}
// update
if let index = self.items.firstIndex(where: { $0.id == instance.id }) {
self.items[index] = instance
self._sendUpdateIfNecessary(instance)
} else { // insert
self.items.append(instance)
self._index?[instance.stringId] = instance
self._sendInsertionIfNecessary(instance)
}
// DispatchQueue(label: "lestorage.queue.items").sync {
defer {
self._hasChanged = true
}
// update
if let index = self.items.firstIndex(where: { $0.id == instance.id }) {
self.items[index] = instance
self._sendUpdateIfNecessary(instance)
} else { // insert
self.items.append(instance)
self._index?[instance.stringId] = instance
self._sendInsertionIfNecessary(instance)
}
// }
}
/// Deletes the instance in the collection by id
public func delete(instance: T) throws {
defer {
self._hasChanged = true
}
defer {
self._hasChanged = true
}
try instance.deleteDependencies()
self.items.removeAll { $0.id == instance.id }
self._index?.removeValue(forKey: instance.stringId)
self._sendDeletionIfNecessary(instance)
try instance.deleteDependencies()
self.items.removeAll { $0.id == instance.id }
self._index?.removeValue(forKey: instance.stringId)
self._sendDeletionIfNecessary(instance)
}
/// Inserts the whole sequence into the items array, no updates
@ -209,7 +212,7 @@ public class StoredCollection<T : Storable> : RandomAccessCollection, SomeCollec
/// Schedules a write operation
fileprivate func _scheduleWrite() {
if self.asynchronousIO {
DispatchQueue(label: "lestorage.queue.write", qos: .utility).async {
DispatchQueue(label: "lestorage.queue.write", qos: .utility).sync { // sync to make sure we don't have writes performed at the same time
self._write()
}
} else {
@ -253,7 +256,7 @@ public class StoredCollection<T : Storable> : RandomAccessCollection, SomeCollec
Task {
do {
let _ = try await self._store.service?.insert(instance)
let _ = try await self._store.service?.update(instance)
} catch {
Logger.error(error)
}

Loading…
Cancel
Save