Skip to content

Commit b2b4ed6

Browse files
committed
Do not generate fetchRequest
There is no need to generate this, it can be looked up at runtime. Also provide a convenience variant that takes a typed sort descriptor.
1 parent c4e4002 commit b2b4ed6

File tree

3 files changed

+33
-19
lines changed

3 files changed

+33
-19
lines changed

Sources/ManagedModelMacros/ModelMacro/ModelMembers.swift

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import SwiftDiagnostics
1515
* named(init), // Initializers.
1616
* named(schemaMetadata), // The metadata.
1717
* named(entity), // Override the `entity()` function.
18-
* named(fetchRequest), // The fetchRequest factory
1918
* named(_$entity), // The cached the Entity
2019
* named(_$originalName),
2120
* named(_$hashModifier)
@@ -49,23 +48,6 @@ extension ModelMacro: MemberMacro { // @attached(member, names:...)
4948
initializers: findInitializers(in: classDecl)
5049
)
5150

52-
if classDecl.findFunctionWithName("fetchRequest", isStaticOrClass: true,
53-
numberOfParametersWithoutDefaults: 0)
54-
== nil
55-
{
56-
let modelClassName = modelClassName.text
57-
newMembers.append(
58-
"""
59-
/// Returns an `NSFetchRequest` setup for the `\(raw: modelClassName)`.
60-
@nonobjc \(raw: access)class func fetchRequest() -> CoreData.NSFetchRequest<\(raw: modelClassName)> {
61-
let fetchRequest = CoreData.NSFetchRequest<\(raw: modelClassName)>(entityName: "\(raw: modelClassName)")
62-
fetchRequest.entity = Self._$entity
63-
return fetchRequest
64-
}
65-
"""
66-
)
67-
}
68-
6951
let metadata = generateMetadataSlot(
7052
access: access,
7153
modelClassName: modelClassName,

Sources/ManagedModels/ModelMacroDefinition.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ public macro _PersistedProperty() =
8282
named(init), // Initializers.
8383
named(schemaMetadata), // The metadata.
8484
named(entity), // Override the `entity()` function.
85-
named(fetchRequest), // The fetchRequest factory
8685
named(_$entity), // The cached the Entity
8786
named(_$originalName),
8887
named(_$hashModifier)

Sources/ManagedModels/PersistentModel/PersistentModel.swift

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,36 @@ extension PersistentModel {
5959
@inlinable
6060
public static var _$entity : NSEntityDescription { self.entity() }
6161
}
62+
63+
public extension PersistentModel {
64+
65+
@inlinable
66+
static func fetchRequest() -> NSFetchRequest<Self> {
67+
NSFetchRequest<Self>(entityName: _$entity.name ?? NSStringFromClass(self))
68+
}
69+
70+
@inlinable
71+
static func fetchRequest<T>(filter : NSPredicate? = nil,
72+
sortBy keyPath : KeyPath<Self, T>,
73+
order: NSSortDescriptor.SortOrder = .forward,
74+
fetchOffset : Int? = nil,
75+
fetchLimit : Int? = nil)
76+
-> NSFetchRequest<Self>
77+
{
78+
let fetchRequest = Self.fetchRequest()
79+
fetchRequest.predicate = filter
80+
if let meta = Self.schemaMetadata.first(where: { $0.keypath == keyPath }) {
81+
fetchRequest.sortDescriptors = [
82+
NSSortDescriptor(key: meta.name, ascending: order == .forward)
83+
]
84+
}
85+
else {
86+
fetchRequest.sortDescriptors = [
87+
NSSortDescriptor(keyPath: keyPath, ascending: order == .forward)
88+
]
89+
}
90+
if let fetchOffset { fetchRequest.fetchOffset = fetchOffset }
91+
if let fetchLimit { fetchRequest.fetchLimit = fetchLimit }
92+
return fetchRequest
93+
}
94+
}

0 commit comments

Comments
 (0)