Skip to content

Commit 55e3bdb

Browse files
committed
Add ModelStorage.insert(_:[ModelData])
1 parent 90f88ff commit 55e3bdb

3 files changed

Lines changed: 39 additions & 2 deletions

File tree

Sources/CoreDataModel/NSManagedObjectContext.swift

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@ extension NSManagedObjectContext: ModelStorage {
3535
try insert(value, model: model)
3636
}
3737

38+
public func insert(_ values: [ModelData]) async throws {
39+
guard let model = self.persistentStoreCoordinator?.managedObjectModel else {
40+
assertionFailure("Missing model")
41+
throw CocoaError(.coreData)
42+
}
43+
try insert(values, model: model)
44+
}
45+
3846
public func delete(_ entity: EntityName, for id: ObjectID) throws {
3947
guard let managedObject = try self.find(entity, for: id) else {
4048
assertionFailure("Object not found for \(id)")
@@ -75,7 +83,8 @@ internal extension NSManagedObjectContext {
7583

7684
func insert(
7785
_ value: ModelData,
78-
model: NSManagedObjectModel
86+
model: NSManagedObjectModel,
87+
shouldSave: Bool = true
7988
) throws {
8089
// find or create
8190
let managedObject = try find(value.entity, for: value.id) ?? create(value.entity, for: value.id, in: model)
@@ -87,7 +96,19 @@ internal extension NSManagedObjectContext {
8796
for (key, value) in value.relationships {
8897
try managedObject.setRelationship(value, for: key, in: self)
8998
}
90-
try save()
99+
if shouldSave {
100+
try self.save()
101+
}
102+
}
103+
104+
func insert(
105+
_ values: [ModelData],
106+
model: NSManagedObjectModel
107+
) throws {
108+
for value in values {
109+
try insert(value, model: model, shouldSave: false)
110+
}
111+
try self.save()
91112
}
92113
}
93114

Sources/CoreDataModel/NSPersistentContainer.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ extension NSPersistentContainer: ModelStorage {
3838
}
3939
}
4040

41+
public func insert(_ values: [ModelData]) async throws {
42+
let model = self.managedObjectModel
43+
try await performBackgroundTask { context in
44+
try context.insert(values, model: model)
45+
}
46+
}
47+
4148
public func delete(_ entity: EntityName, for id: ObjectID) async throws {
4249
try await performBackgroundTask { context in
4350
try context.delete(entity, for: id)

Sources/CoreModel/Store.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ public protocol ModelStorage: AnyObject {
2323
/// Create or edit a managed object.
2424
func insert(_ value: ModelData) async throws
2525

26+
/// Create or edit multiple managed objects.
27+
func insert(_ values: [ModelData]) async throws
28+
2629
/// Delete the specified managed object.
2730
func delete(_ entity: EntityName, for id: ObjectID) async throws
2831
}
@@ -32,6 +35,12 @@ public extension ModelStorage {
3235
func count(_ fetchRequest: FetchRequest) async throws -> UInt {
3336
return try await UInt(fetch(fetchRequest).count)
3437
}
38+
39+
func insert(_ values: [ModelData]) async throws {
40+
for model in values {
41+
try await insert(model)
42+
}
43+
}
3544
}
3645

3746
// MARK: - ModelData

0 commit comments

Comments
 (0)