Skip to content

Commit 274d765

Browse files
committed
Add ModelStorage.fetchID()
1 parent 42ecd73 commit 274d765

5 files changed

Lines changed: 22 additions & 1 deletion

File tree

Sources/CoreDataModel/NSEntityDescription.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ internal extension NSEntityDescription {
3030
properties += entity.attributes.map { NSAttributeDescription(attribute: $0) }
3131
properties += entity.relationships.map { NSRelationshipDescription(relationship: $0) }
3232
self.properties = properties
33+
self.uniquenessConstraints = [[NSManagedObject.BuiltInProperty.id.rawValue as NSString]]
3334
}
3435
}
3536

Sources/CoreDataModel/NSFetchRequest.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,12 @@ import CoreModel
1414
public extension FetchRequest {
1515

1616
func toFoundation() -> NSFetchRequest<NSManagedObject> {
17+
toFoundation(NSManagedObject.self)
18+
}
19+
20+
func toFoundation<ResultType: NSFetchRequestResult>(_ result: ResultType.Type) -> NSFetchRequest<ResultType> {
1721

18-
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: entity.rawValue)
22+
let fetchRequest = NSFetchRequest<ResultType>(entityName: entity.rawValue)
1923
fetchRequest.predicate = predicate?.toFoundation()
2024
fetchRequest.fetchLimit = fetchLimit
2125
fetchRequest.sortDescriptors = sortDescriptors.map {

Sources/CoreDataModel/NSManagedObjectContext.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@ extension NSManagedObjectContext: ModelStorage {
4949
}
5050
self.delete(managedObject)
5151
}
52+
53+
public func fetchID(_ fetchRequest: FetchRequest) throws -> [ObjectID] {
54+
let fetch = fetchRequest.toFoundation()
55+
fetch.propertiesToFetch = [NSManagedObject.BuiltInProperty.id.rawValue]
56+
fetch.returnsObjectsAsFaults = false
57+
return try self.fetch(fetchRequest.toFoundation()).map { try $0.modelObjectID }
58+
}
5259
}
5360

5461
internal extension NSManagedObjectContext {

Sources/CoreDataModel/NSPersistentContainer.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ extension NSPersistentContainer: ModelStorage {
5050
try context.delete(entity, for: id)
5151
}
5252
}
53+
54+
public func fetchID(_ fetchRequest: FetchRequest) async throws -> [ObjectID] {
55+
try await performBackgroundTask { context in
56+
try context.fetchID(fetchRequest)
57+
}
58+
}
5359
}
5460

5561
@available(macOS 12, iOS 15, watchOS 8, tvOS 15, *)

Sources/CoreModel/Store.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ public protocol ModelStorage {
1515
/// Fetch managed objects.
1616
func fetch(_ fetchRequest: FetchRequest) async throws -> [ModelData]
1717

18+
/// Fetch managed objects IDs.
19+
func fetchID(_ fetchRequest: FetchRequest) async throws -> [ObjectID]
20+
1821
/// Fetch and return result count.
1922
func count(_ fetchRequest: FetchRequest) async throws -> UInt
2023

0 commit comments

Comments
 (0)