|
|
|
|
@ -25,7 +25,7 @@ public protocol SomeCollection<Item>: Identifiable { |
|
|
|
|
func deleteDependencies(actionOption: ActionOption, _ isIncluded: (Item) -> Bool) |
|
|
|
|
|
|
|
|
|
func findById(_ id: Item.ID) -> Item? |
|
|
|
|
func requestWrite() |
|
|
|
|
func requestWriteIfNecessary() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protocol CollectionDelegate<Item> { |
|
|
|
|
@ -81,7 +81,7 @@ public class StoredCollection<T: Storable>: SomeCollection { |
|
|
|
|
/// Indicates whether the collection has changed, thus requiring a write operation |
|
|
|
|
fileprivate var _triggerWrite: Bool = false { |
|
|
|
|
didSet { |
|
|
|
|
if self._triggerWrite == true && self.inMemory == false { |
|
|
|
|
if self._triggerWrite == true { |
|
|
|
|
self._scheduleWrite() |
|
|
|
|
self._triggerWrite = false |
|
|
|
|
} |
|
|
|
|
@ -143,8 +143,10 @@ public class StoredCollection<T: Storable>: SomeCollection { |
|
|
|
|
// MARK: - Loading |
|
|
|
|
|
|
|
|
|
/// Sets the collection as changed to trigger a write |
|
|
|
|
public func requestWrite() { |
|
|
|
|
self._triggerWrite = true |
|
|
|
|
public func requestWriteIfNecessary() { |
|
|
|
|
if self.inMemory == false { |
|
|
|
|
self._triggerWrite = true |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// Migrates if necessary and asynchronously decodes the json file |
|
|
|
|
@ -214,7 +216,6 @@ public class StoredCollection<T: Storable>: SomeCollection { |
|
|
|
|
for item in items { |
|
|
|
|
self._addItem(instance: item) |
|
|
|
|
} |
|
|
|
|
self.requestWrite() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@MainActor |
|
|
|
|
@ -226,7 +227,7 @@ public class StoredCollection<T: Storable>: SomeCollection { |
|
|
|
|
self.setAsLoaded() |
|
|
|
|
self.addOrUpdate(contentOfs: items) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
self.requestWriteIfNecessary() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// Updates the whole index with the items array |
|
|
|
|
@ -242,7 +243,7 @@ public class StoredCollection<T: Storable>: SomeCollection { |
|
|
|
|
/// Adds it if its id is not found, and otherwise updates it |
|
|
|
|
@discardableResult public func addOrUpdate(instance: T) -> ActionResult<T> { |
|
|
|
|
defer { |
|
|
|
|
self.requestWrite() |
|
|
|
|
self.requestWriteIfNecessary() |
|
|
|
|
} |
|
|
|
|
return self._rawAddOrUpdate(instance: instance) |
|
|
|
|
} |
|
|
|
|
@ -251,7 +252,7 @@ public class StoredCollection<T: Storable>: SomeCollection { |
|
|
|
|
public func addOrUpdate(contentOfs sequence: any Sequence<T>, _ handler: ((ActionResult<T>) -> ())? = nil) { |
|
|
|
|
|
|
|
|
|
defer { |
|
|
|
|
self.requestWrite() |
|
|
|
|
self.requestWriteIfNecessary() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for instance in sequence { |
|
|
|
|
@ -274,7 +275,7 @@ public class StoredCollection<T: Storable>: SomeCollection { |
|
|
|
|
/// A method the treat the collection as a single instance holder |
|
|
|
|
func setSingletonNoSync(instance: T) { |
|
|
|
|
defer { |
|
|
|
|
self.requestWrite() |
|
|
|
|
self.requestWriteIfNecessary() |
|
|
|
|
} |
|
|
|
|
self.items.removeAll() |
|
|
|
|
self._addItem(instance: instance) |
|
|
|
|
@ -424,7 +425,7 @@ public class StoredCollection<T: Storable>: SomeCollection { |
|
|
|
|
self.deleteItem(instance, actionOption: actionOption) |
|
|
|
|
} |
|
|
|
|
if actionOption.write { |
|
|
|
|
self.requestWrite() |
|
|
|
|
self.requestWriteIfNecessary() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -440,7 +441,7 @@ public class StoredCollection<T: Storable>: SomeCollection { |
|
|
|
|
/// Also removes related API calls |
|
|
|
|
public func deleteDependencies(_ items: any Sequence<T>) { |
|
|
|
|
defer { |
|
|
|
|
self.requestWrite() |
|
|
|
|
self.requestWriteIfNecessary() |
|
|
|
|
} |
|
|
|
|
let itemsArray = Array(items) // fix error if items is self.items |
|
|
|
|
for item in itemsArray { |
|
|
|
|
@ -567,7 +568,7 @@ public class StoredCollection<T: Storable>: SomeCollection { |
|
|
|
|
func updateLocalInstance(_ serverInstance: T) { |
|
|
|
|
if let localInstance = self.findById(serverInstance.id) { |
|
|
|
|
localInstance.copy(from: serverInstance) |
|
|
|
|
self.requestWrite() |
|
|
|
|
self.requestWriteIfNecessary() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|