diff --git a/CoreStore.xcodeproj/project.pbxproj b/CoreStore.xcodeproj/project.pbxproj index 8a2b3a5..64d9aa9 100644 --- a/CoreStore.xcodeproj/project.pbxproj +++ b/CoreStore.xcodeproj/project.pbxproj @@ -293,6 +293,10 @@ B546F9741C9C553300D5AC55 /* SetupResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = B546F9721C9C553300D5AC55 /* SetupResult.swift */; }; B546F9751C9C553300D5AC55 /* SetupResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = B546F9721C9C553300D5AC55 /* SetupResult.swift */; }; B546F9761C9C553300D5AC55 /* SetupResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = B546F9721C9C553300D5AC55 /* SetupResult.swift */; }; + B5474D152227C08700B21FEC /* CoreStoreFetchRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5474D142227C08700B21FEC /* CoreStoreFetchRequest.swift */; }; + B5474D162227C08700B21FEC /* CoreStoreFetchRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5474D142227C08700B21FEC /* CoreStoreFetchRequest.swift */; }; + B5474D172227C08700B21FEC /* CoreStoreFetchRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5474D142227C08700B21FEC /* CoreStoreFetchRequest.swift */; }; + B5474D182227C08700B21FEC /* CoreStoreFetchRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5474D142227C08700B21FEC /* CoreStoreFetchRequest.swift */; }; B5489F3F1CF5EEBC008B4978 /* TestEntity1.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5489F3D1CF5EEBC008B4978 /* TestEntity1.swift */; }; B5489F401CF5EEBC008B4978 /* TestEntity1.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5489F3D1CF5EEBC008B4978 /* TestEntity1.swift */; }; B5489F411CF5EEBC008B4978 /* TestEntity1.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5489F3D1CF5EEBC008B4978 /* TestEntity1.swift */; }; @@ -823,6 +827,7 @@ B546F95C1C9A12B800D5AC55 /* CSSQliteStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSSQliteStore.swift; sourceTree = ""; }; B546F9681C9AF26D00D5AC55 /* CSInMemoryStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSInMemoryStore.swift; sourceTree = ""; }; B546F9721C9C553300D5AC55 /* SetupResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetupResult.swift; sourceTree = ""; }; + B5474D142227C08700B21FEC /* CoreStoreFetchRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreStoreFetchRequest.swift; sourceTree = ""; }; B5489F3D1CF5EEBC008B4978 /* TestEntity1.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestEntity1.swift; sourceTree = ""; }; B5489F3E1CF5EEBC008B4978 /* TestEntity2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestEntity2.swift; sourceTree = ""; }; B5489F451CF5F017008B4978 /* TransactionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionTests.swift; sourceTree = ""; }; @@ -1539,6 +1544,7 @@ children = ( B5831B6F1F34AC3400A9F647 /* AttributeProtocol.swift */, B5831B741F34AC7A00A9F647 /* RelationshipProtocol.swift */, + B5474D142227C08700B21FEC /* CoreStoreFetchRequest.swift */, B5C976E61C6E3A5900B1AF90 /* CoreStoreFetchedResultsController.swift */, B53B275E1EE3B92E00E9B352 /* CoreStoreManagedObject.swift */, B533C4DA1D7D4BFA001383CB /* DispatchQueue+CoreStore.swift */, @@ -2028,6 +2034,7 @@ B5FE4DA71C84FB4400FA6A91 /* InMemoryStore.swift in Sources */, B52F743D1E9B8724005F3DAC /* DynamicSchema.swift in Sources */, B5E8A72021C1015300EF006A /* CoreStoreObject+Observing.swift in Sources */, + B5474D152227C08700B21FEC /* CoreStoreFetchRequest.swift in Sources */, B56923FF1EB82976007C4DC9 /* CSUnsafeDataModelSchema.swift in Sources */, B5215CAE1FA4812500139E3A /* SectionMonitorBuilder.swift in Sources */, B5ECDBEC1CA6BF2000C7F112 /* CSFrom.swift in Sources */, @@ -2226,6 +2233,7 @@ B5ECDBEE1CA6BF2000C7F112 /* CSFrom.swift in Sources */, B52F743E1E9B8724005F3DAC /* DynamicSchema.swift in Sources */, B5E8A72121C1015300EF006A /* CoreStoreObject+Observing.swift in Sources */, + B5474D162227C08700B21FEC /* CoreStoreFetchRequest.swift in Sources */, B56924001EB82976007C4DC9 /* CSUnsafeDataModelSchema.swift in Sources */, B5215CAF1FA4812500139E3A /* SectionMonitorBuilder.swift in Sources */, 82BA18D61C4BBD7100A0916E /* NSManagedObjectContext+Transaction.swift in Sources */, @@ -2424,6 +2432,7 @@ B5220E201D130813009BC71E /* CSObjectMonitor.swift in Sources */, B52F74401E9B8724005F3DAC /* DynamicSchema.swift in Sources */, B5E8A72321C1015300EF006A /* CoreStoreObject+Observing.swift in Sources */, + B5474D182227C08700B21FEC /* CoreStoreFetchRequest.swift in Sources */, B56924021EB82976007C4DC9 /* CSUnsafeDataModelSchema.swift in Sources */, B5215CB11FA4812500139E3A /* SectionMonitorBuilder.swift in Sources */, B5220E171D1306DF009BC71E /* UnsafeDataTransaction+Observing.swift in Sources */, @@ -2622,6 +2631,7 @@ B5ECDBEF1CA6BF2000C7F112 /* CSFrom.swift in Sources */, B52F743F1E9B8724005F3DAC /* DynamicSchema.swift in Sources */, B5E8A72221C1015300EF006A /* CoreStoreObject+Observing.swift in Sources */, + B5474D172227C08700B21FEC /* CoreStoreFetchRequest.swift in Sources */, B56924011EB82976007C4DC9 /* CSUnsafeDataModelSchema.swift in Sources */, B5215CB01FA4812500139E3A /* SectionMonitorBuilder.swift in Sources */, B56321B41BD6521C006C9394 /* NSManagedObjectContext+Transaction.swift in Sources */, diff --git a/CoreStoreTests/FromTests.swift b/CoreStoreTests/FromTests.swift index 51b1f2d..a36cb50 100644 --- a/CoreStoreTests/FromTests.swift +++ b/CoreStoreTests/FromTests.swift @@ -74,31 +74,31 @@ final class FromTests: BaseTestCase { let from = From() - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() try from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertEqual(affectedConfigurations, ["PF_DEFAULT_CONFIGURATION_NAME"]) } do { let from = From("Config1") - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } } @@ -113,98 +113,98 @@ final class FromTests: BaseTestCase { let from = From() - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() let storesFound: Void? = try? from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(storesFound) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertEqual(affectedConfigurations, ["Config1"]) } do { let from = From("Config1") - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() let storesFound: Void? = try? from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(storesFound) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertEqual(affectedConfigurations, ["Config1"]) } do { let from = From("Config2") - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } do { let from = From() - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } do { let from = From("Config1") - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } do { let from = From("Config2") - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } } @@ -219,96 +219,96 @@ final class FromTests: BaseTestCase { let from = From() - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() let storesFound: Void? = try? from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(storesFound) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertEqual(Set(affectedConfigurations), ["PF_DEFAULT_CONFIGURATION_NAME", "Config1"] as Set) } do { let from = From("Config1") - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() let storesFound: Void? = try? from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(storesFound) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertEqual(affectedConfigurations, ["Config1"]) } do { let from = From("Config2") - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } do { let from = From() - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() let storesFound: Void? = try? from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(storesFound) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertEqual(affectedConfigurations, ["PF_DEFAULT_CONFIGURATION_NAME"]) } do { let from = From("Config1") - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } do { let from = From("Config2") - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } } @@ -323,94 +323,94 @@ final class FromTests: BaseTestCase { let from = From() - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() let storesFound: Void? = try? from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(storesFound) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertEqual(affectedConfigurations, ["Config1"]) } do { let from = From("Config1") - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() let storesFound: Void? = try? from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(storesFound) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertEqual(affectedConfigurations, ["Config1"]) } do { let from = From("Config2") - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } do { let from = From() - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() let storesFound: Void? = try? from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(storesFound) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertEqual(affectedConfigurations, ["Config2"]) } do { let from = From("Config1") - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } do { let from = From("Config2") - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() let storesFound: Void? = try? from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(storesFound) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.affectedStores) + XCTAssertNotNil(request.safeAffectedStores()) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] + let affectedConfigurations = request.safeAffectedStores()?.map { $0.configurationName } ?? [] XCTAssertEqual(affectedConfigurations, ["Config2"]) } } diff --git a/CoreStoreTests/GroupByTests.swift b/CoreStoreTests/GroupByTests.swift index a2500ca..af82cae 100644 --- a/CoreStoreTests/GroupByTests.swift +++ b/CoreStoreTests/GroupByTests.swift @@ -68,7 +68,7 @@ final class GroupByTests: BaseTestCase { let groupBy = GroupBy(#keyPath(TestEntity1.testString)) - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() try From().applyToFetchRequest(request, context: dataStack.mainContext) groupBy.applyToFetchRequest(request) diff --git a/CoreStoreTests/OrderByTests.swift b/CoreStoreTests/OrderByTests.swift index e7fd03c..56599bf 100644 --- a/CoreStoreTests/OrderByTests.swift +++ b/CoreStoreTests/OrderByTests.swift @@ -179,7 +179,7 @@ final class OrderByTests: XCTestCase { dynamic func test_ThatOrderByClauses_ApplyToFetchRequestsCorrectly() { let orderBy = OrderBy(.ascending("key")) - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() orderBy.applyToFetchRequest(request) XCTAssertNotNil(request.sortDescriptors) XCTAssertEqual(request.sortDescriptors ?? [], orderBy.sortDescriptors) diff --git a/CoreStoreTests/TweakTests.swift b/CoreStoreTests/TweakTests.swift index 5d435ec..d4ea885 100644 --- a/CoreStoreTests/TweakTests.swift +++ b/CoreStoreTests/TweakTests.swift @@ -43,7 +43,7 @@ final class TweakTests: XCTestCase { $0.fetchLimit = 200 $0.predicate = predicate } - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() tweak.applyToFetchRequest(request) XCTAssertEqual(request.fetchOffset, 100) XCTAssertEqual(request.fetchLimit, 200) diff --git a/CoreStoreTests/WhereTests.swift b/CoreStoreTests/WhereTests.swift index 231976a..29f4ac5 100644 --- a/CoreStoreTests/WhereTests.swift +++ b/CoreStoreTests/WhereTests.swift @@ -583,7 +583,7 @@ final class WhereTests: XCTestCase { dynamic func test_ThatWhereClauses_ApplyToFetchRequestsCorrectly() { let whereClause = Where("key", isEqualTo: "value") - let request = NSFetchRequest() + let request = CoreStoreFetchRequest() whereClause.applyToFetchRequest(request) XCTAssertNotNil(request.predicate) XCTAssertEqual(request.predicate, whereClause.predicate) diff --git a/Sources/CSDataStack+Observing.swift b/Sources/CSDataStack+Observing.swift index 1eda16b..5cc88f3 100644 --- a/Sources/CSDataStack+Observing.swift +++ b/Sources/CSDataStack+Observing.swift @@ -68,7 +68,7 @@ extension CSDataStack { sectionBy: nil, applyFetchClauses: { (fetchRequest) in - fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } + fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } } ).bridgeToObjectiveC } @@ -97,7 +97,7 @@ extension CSDataStack { sectionBy: nil, applyFetchClauses: { (fetchRequest) in - fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } + fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } }, createAsynchronously: { @@ -131,7 +131,7 @@ extension CSDataStack { sectionBy: sectionBy.bridgeToSwift, applyFetchClauses: { (fetchRequest) in - fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } + fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } } ).bridgeToObjectiveC } @@ -160,7 +160,7 @@ extension CSDataStack { sectionBy: sectionBy.bridgeToSwift, applyFetchClauses: { (fetchRequest) in - fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } + fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } }, createAsynchronously: { diff --git a/Sources/CSListMonitor.swift b/Sources/CSListMonitor.swift index eb028d4..f84e907 100644 --- a/Sources/CSListMonitor.swift +++ b/Sources/CSListMonitor.swift @@ -503,7 +503,7 @@ public final class CSListMonitor: NSObject { self.bridgeToSwift.refetch { (fetchRequest) in - fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } + fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } } } diff --git a/Sources/CoreStoreFetchRequest.swift b/Sources/CoreStoreFetchRequest.swift new file mode 100644 index 0000000..f04326f --- /dev/null +++ b/Sources/CoreStoreFetchRequest.swift @@ -0,0 +1,91 @@ +// +// CoreStoreFetchRequest.swift +// CoreStore +// +// Copyright © 2019 John Rommel Estropia +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// + +import Foundation +import CoreData +import ObjectiveC + + +// MARK: - CoreStoreFetchRequest + +// Bugfix for NSFetchRequest messing up memory management for `affectedStores` +// http://stackoverflow.com/questions/14396375/nsfetchedresultscontroller-crashes-in-ios-6-if-affectedstores-is-specified +internal final class CoreStoreFetchRequest: NSFetchRequest { + + @nonobjc + internal func safeAffectedStores() -> [NSPersistentStore]? { + + return self.copiedAffectedStores as! [NSPersistentStore]? + } + + @nonobjc @inline(__always) + internal func staticCast() -> NSFetchRequest { + + return unsafeBitCast(self, to: NSFetchRequest.self) + } + + @nonobjc @inline(__always) + internal func dynamicCast() -> NSFetchRequest { + + return unsafeBitCast(self, to: NSFetchRequest.self) + } + + + // MARK: NSFetchRequest + + @objc dynamic + override var affectedStores: [NSPersistentStore]? { + + get { + + return super.affectedStores + } + set { + + if #available(iOS 11.0, macOS 10.13, watchOS 4.0, tvOS 11.0) { + + self.copiedAffectedStores = (newValue as NSArray?)?.copy() as! NSArray? + super.affectedStores = newValue + return + } + // Bugfix for NSFetchRequest messing up memory management for `affectedStores` + // http://stackoverflow.com/questions/14396375/nsfetchedresultscontroller-crashes-in-ios-6-if-affectedstores-is-specified + if let releaseArray = self.releaseArray { + + releaseArray.release() + self.releaseArray = nil + } + self.copiedAffectedStores = (newValue as NSArray?)?.copy() as! NSArray? + super.affectedStores = newValue + self.releaseArray = (super.affectedStores as NSArray?).map(Unmanaged.passRetained(_:)) + } + } + + + // MARK: Private + + private var copiedAffectedStores: NSArray? + private var releaseArray: Unmanaged? +} diff --git a/Sources/CoreStoreFetchedResultsController.swift b/Sources/CoreStoreFetchedResultsController.swift index 3638362..f7673fb 100644 --- a/Sources/CoreStoreFetchedResultsController.swift +++ b/Sources/CoreStoreFetchedResultsController.swift @@ -33,10 +33,13 @@ import CoreData internal final class CoreStoreFetchedResultsController: NSFetchedResultsController { // MARK: Internal + + @nonobjc + internal let typedFetchRequest: CoreStoreFetchRequest @nonobjc - internal convenience init(dataStack: DataStack, fetchRequest: NSFetchRequest, from: From, sectionBy: SectionBy? = nil, applyFetchClauses: @escaping (_ fetchRequest: NSFetchRequest) -> Void) { - + internal convenience init(dataStack: DataStack, fetchRequest: CoreStoreFetchRequest, from: From, sectionBy: SectionBy? = nil, applyFetchClauses: @escaping (_ fetchRequest: CoreStoreFetchRequest) -> Void) { + self.init( context: dataStack.mainContext, fetchRequest: fetchRequest, @@ -47,7 +50,7 @@ internal final class CoreStoreFetchedResultsController: NSFetchedResultsControll } @nonobjc - internal init(context: NSManagedObjectContext, fetchRequest: NSFetchRequest, from: From, sectionBy: SectionBy? = nil, applyFetchClauses: @escaping (_ fetchRequest: NSFetchRequest) -> Void) { + internal init(context: NSManagedObjectContext, fetchRequest: CoreStoreFetchRequest, from: From, sectionBy: SectionBy? = nil, applyFetchClauses: @escaping (_ fetchRequest: CoreStoreFetchRequest) -> Void) { _ = try? from.applyToFetchRequest( fetchRequest, @@ -55,14 +58,15 @@ internal final class CoreStoreFetchedResultsController: NSFetchedResultsControll applyAffectedStores: false ) applyFetchClauses(fetchRequest) - + + self.typedFetchRequest = fetchRequest self.reapplyAffectedStores = { fetchRequest, context in try from.applyAffectedStoresForFetchedRequest(fetchRequest, context: context) } super.init( - fetchRequest: fetchRequest, + fetchRequest: fetchRequest.staticCast(), managedObjectContext: context, sectionNameKeyPath: sectionBy?.sectionKeyPath, cacheName: nil @@ -72,7 +76,7 @@ internal final class CoreStoreFetchedResultsController: NSFetchedResultsControll @nonobjc internal func performFetchFromSpecifiedStores() throws { - try self.reapplyAffectedStores(self.fetchRequest, self.managedObjectContext) + try self.reapplyAffectedStores(self.typedFetchRequest, self.managedObjectContext) try self.performFetch() } @@ -91,5 +95,5 @@ internal final class CoreStoreFetchedResultsController: NSFetchedResultsControll // MARK: Private @nonobjc - private let reapplyAffectedStores: (_ fetchRequest: NSFetchRequest, _ context: NSManagedObjectContext) throws -> Void + private let reapplyAffectedStores: (_ fetchRequest: CoreStoreFetchRequest, _ context: NSManagedObjectContext) throws -> Void } diff --git a/Sources/From.swift b/Sources/From.swift index 13b2e9e..e75a1bb 100644 --- a/Sources/From.swift +++ b/Sources/From.swift @@ -139,7 +139,7 @@ public struct From { self.findPersistentStores = findPersistentStores } - internal func applyToFetchRequest(_ fetchRequest: NSFetchRequest, context: NSManagedObjectContext, applyAffectedStores: Bool = true) throws { + internal func applyToFetchRequest(_ fetchRequest: CoreStoreFetchRequest, context: NSManagedObjectContext, applyAffectedStores: Bool = true) throws { fetchRequest.entity = context.parentStack!.entityDescription(for: EntityIdentifier(self.entityClass))! guard applyAffectedStores else { @@ -164,7 +164,7 @@ public struct From { } } - internal func applyAffectedStoresForFetchedRequest(_ fetchRequest: NSFetchRequest, context: NSManagedObjectContext) throws { + internal func applyAffectedStoresForFetchedRequest(_ fetchRequest: CoreStoreFetchRequest, context: NSManagedObjectContext) throws { let stores = self.findPersistentStores(context) fetchRequest.affectedStores = stores diff --git a/Sources/ListMonitor.swift b/Sources/ListMonitor.swift index a7e1b28..9d8ab88 100644 --- a/Sources/ListMonitor.swift +++ b/Sources/ListMonitor.swift @@ -628,7 +628,7 @@ public final class ListMonitor: Hashable { // MARK: Internal - internal convenience init(dataStack: DataStack, from: From, sectionBy: SectionBy?, applyFetchClauses: @escaping (_ fetchRequest: NSFetchRequest) -> Void) { + internal convenience init(dataStack: DataStack, from: From, sectionBy: SectionBy?, applyFetchClauses: @escaping (_ fetchRequest: CoreStoreFetchRequest) -> Void) { self.init( context: dataStack.mainContext, @@ -640,7 +640,7 @@ public final class ListMonitor: Hashable { ) } - internal convenience init(dataStack: DataStack, from: From, sectionBy: SectionBy?, applyFetchClauses: @escaping (_ fetchRequest: NSFetchRequest) -> Void, createAsynchronously: @escaping (ListMonitor) -> Void) { + internal convenience init(dataStack: DataStack, from: From, sectionBy: SectionBy?, applyFetchClauses: @escaping (_ fetchRequest: CoreStoreFetchRequest) -> Void, createAsynchronously: @escaping (ListMonitor) -> Void) { self.init( context: dataStack.mainContext, @@ -652,7 +652,7 @@ public final class ListMonitor: Hashable { ) } - internal convenience init(unsafeTransaction: UnsafeDataTransaction, from: From, sectionBy: SectionBy?, applyFetchClauses: @escaping (_ fetchRequest: NSFetchRequest) -> Void) { + internal convenience init(unsafeTransaction: UnsafeDataTransaction, from: From, sectionBy: SectionBy?, applyFetchClauses: @escaping (_ fetchRequest: CoreStoreFetchRequest) -> Void) { self.init( context: unsafeTransaction.context, @@ -664,7 +664,7 @@ public final class ListMonitor: Hashable { ) } - internal convenience init(unsafeTransaction: UnsafeDataTransaction, from: From, sectionBy: SectionBy?, applyFetchClauses: @escaping (_ fetchRequest: NSFetchRequest) -> Void, createAsynchronously: @escaping (ListMonitor) -> Void) { + internal convenience init(unsafeTransaction: UnsafeDataTransaction, from: From, sectionBy: SectionBy?, applyFetchClauses: @escaping (_ fetchRequest: CoreStoreFetchRequest) -> Void, createAsynchronously: @escaping (ListMonitor) -> Void) { self.init( context: unsafeTransaction.context, @@ -923,7 +923,7 @@ public final class ListMonitor: Hashable { cs_setAssociatedRetainedObject(nilValue, forKey: &self.didDeleteSectionKey, inObject: observer) } - internal func refetch(_ applyFetchClauses: @escaping (_ fetchRequest: NSFetchRequest) -> Void) { + internal func refetch(_ applyFetchClauses: @escaping (_ fetchRequest: CoreStoreFetchRequest) -> Void) { CoreStore.assert( Thread.isMainThread, @@ -1022,7 +1022,7 @@ public final class ListMonitor: Hashable { private var observerForWillChangePersistentStore: NotificationObserver! private var observerForDidChangePersistentStore: NotificationObserver! private let transactionQueue: DispatchQueue - private var applyFetchClauses: (_ fetchRequest: NSFetchRequest) -> Void + private var applyFetchClauses: (_ fetchRequest: CoreStoreFetchRequest) -> Void private var isPersistentStoreChanging: Bool = false { @@ -1045,9 +1045,9 @@ public final class ListMonitor: Hashable { } } - private static func recreateFetchedResultsController(context: NSManagedObjectContext, from: From, sectionBy: SectionBy?, applyFetchClauses: @escaping (_ fetchRequest: NSFetchRequest) -> Void) -> (controller: CoreStoreFetchedResultsController, delegate: FetchedResultsControllerDelegate) { + private static func recreateFetchedResultsController(context: NSManagedObjectContext, from: From, sectionBy: SectionBy?, applyFetchClauses: @escaping (_ fetchRequest: CoreStoreFetchRequest) -> Void) -> (controller: CoreStoreFetchedResultsController, delegate: FetchedResultsControllerDelegate) { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() fetchRequest.fetchLimit = 0 fetchRequest.resultType = .managedObjectResultType fetchRequest.fetchBatchSize = 20 @@ -1071,7 +1071,7 @@ public final class ListMonitor: Hashable { private let from: From private let sectionBy: SectionBy? - private init(context: NSManagedObjectContext, transactionQueue: DispatchQueue, from: From, sectionBy: SectionBy?, applyFetchClauses: @escaping (_ fetchRequest: NSFetchRequest) -> Void, createAsynchronously: ((ListMonitor) -> Void)?) { + private init(context: NSManagedObjectContext, transactionQueue: DispatchQueue, from: From, sectionBy: SectionBy?, applyFetchClauses: @escaping (_ fetchRequest: CoreStoreFetchRequest) -> Void, createAsynchronously: ((ListMonitor) -> Void)?) { self.isSectioned = (sectionBy != nil) self.from = from @@ -1114,7 +1114,7 @@ public final class ListMonitor: Hashable { self.isPersistentStoreChanging = true guard let removedStores = (note.userInfo?[NSRemovedPersistentStoresKey] as? [NSPersistentStore]).flatMap(Set.init), - !Set(self.fetchedResultsController.fetchRequest.affectedStores ?? []).intersection(removedStores).isEmpty else { + !Set(self.fetchedResultsController.typedFetchRequest.safeAffectedStores() ?? []).intersection(removedStores).isEmpty else { return } @@ -1135,7 +1135,7 @@ public final class ListMonitor: Hashable { if !self.isPendingRefetch { - let previousStores = Set(self.fetchedResultsController.fetchRequest.affectedStores ?? []) + let previousStores = Set(self.fetchedResultsController.typedFetchRequest.safeAffectedStores() ?? []) let currentStores = previousStores .subtracting(note.userInfo?[NSRemovedPersistentStoresKey] as? [NSPersistentStore] ?? []) .union(note.userInfo?[NSAddedPersistentStoresKey] as? [NSPersistentStore] ?? []) diff --git a/Sources/NSFetchedResultsController+Convenience.swift b/Sources/NSFetchedResultsController+Convenience.swift index 5fa63fa..227fac7 100644 --- a/Sources/NSFetchedResultsController+Convenience.swift +++ b/Sources/NSFetchedResultsController+Convenience.swift @@ -205,12 +205,12 @@ fileprivate func createFRC(fromContext context: NSManagedObj let controller = CoreStoreFetchedResultsController( context: context, - fetchRequest: NSFetchRequest(), + fetchRequest: CoreStoreFetchRequest(), from: from, sectionBy: sectionBy, applyFetchClauses: { (fetchRequest) in - fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } + fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } CoreStore.assert( fetchRequest.sortDescriptors?.isEmpty == false, diff --git a/Sources/NSFetchedResultsController+ObjectiveC.swift b/Sources/NSFetchedResultsController+ObjectiveC.swift index 0851666..8befb8a 100644 --- a/Sources/NSFetchedResultsController+ObjectiveC.swift +++ b/Sources/NSFetchedResultsController+ObjectiveC.swift @@ -72,12 +72,12 @@ fileprivate func createFRC(fromContext context: NSManagedObjectContext, from: CS let controller = CoreStoreFetchedResultsController( context: context, - fetchRequest: NSFetchRequest(), + fetchRequest: CoreStoreFetchRequest(), from: from.bridgeToSwift, sectionBy: sectionBy?.bridgeToSwift, applyFetchClauses: { (fetchRequest) in - fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } + fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } CoreStore.assert( fetchRequest.sortDescriptors?.isEmpty == false, diff --git a/Sources/NSManagedObjectContext+ObjectiveC.swift b/Sources/NSManagedObjectContext+ObjectiveC.swift index bc52ca0..dbd1c33 100644 --- a/Sources/NSManagedObjectContext+ObjectiveC.swift +++ b/Sources/NSManagedObjectContext+ObjectiveC.swift @@ -36,12 +36,12 @@ extension NSManagedObjectContext { @nonobjc internal func fetchOne(_ from: CSFrom, _ fetchClauses: [CSFetchClause]) throws -> NSManagedObject? { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() try from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 1 fetchRequest.resultType = .managedObjectResultType - fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } + fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } return try self.fetchOne(fetchRequest) } @@ -49,12 +49,12 @@ extension NSManagedObjectContext { @nonobjc internal func fetchAll(_ from: CSFrom, _ fetchClauses: [CSFetchClause]) throws -> [T] { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() try from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 fetchRequest.resultType = .managedObjectResultType - fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } + fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } return try self.fetchAll(fetchRequest) } @@ -62,11 +62,11 @@ extension NSManagedObjectContext { @nonobjc internal func fetchCount(_ from: CSFrom, _ fetchClauses: [CSFetchClause]) throws -> Int { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() try from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self) fetchRequest.resultType = .countResultType - fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } + fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } return try self.fetchCount(fetchRequest) } @@ -74,12 +74,12 @@ extension NSManagedObjectContext { @nonobjc internal func fetchObjectID(_ from: CSFrom, _ fetchClauses: [CSFetchClause]) throws -> NSManagedObjectID? { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() try from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 1 fetchRequest.resultType = .managedObjectIDResultType - fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } + fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } return try self.fetchObjectID(fetchRequest) } @@ -87,12 +87,12 @@ extension NSManagedObjectContext { @nonobjc internal func fetchObjectIDs(_ from: CSFrom, _ fetchClauses: [CSFetchClause]) throws -> [NSManagedObjectID] { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() try from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 fetchRequest.resultType = .managedObjectIDResultType - fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } + fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } return try self.fetchObjectIDs(fetchRequest) } @@ -100,14 +100,14 @@ extension NSManagedObjectContext { @nonobjc internal func deleteAll(_ from: CSFrom, _ deleteClauses: [CSDeleteClause]) throws -> Int { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() try from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 fetchRequest.resultType = .managedObjectResultType fetchRequest.returnsObjectsAsFaults = true fetchRequest.includesPropertyValues = false - deleteClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } + deleteClauses.forEach { $0.applyToFetchRequest(fetchRequest) } return try self.deleteAll(fetchRequest) } @@ -115,13 +115,13 @@ extension NSManagedObjectContext { @nonobjc internal func queryValue(_ from: CSFrom, _ selectClause: CSSelect, _ queryClauses: [CSQueryClause]) throws -> Any? { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() try from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 - selectClause.applyToFetchRequest(fetchRequest as! NSFetchRequest) - queryClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } + selectClause.applyToFetchRequest(fetchRequest) + queryClauses.forEach { $0.applyToFetchRequest(fetchRequest) } return try self.queryValue(selectClause.selectTerms, fetchRequest: fetchRequest) } @@ -129,13 +129,13 @@ extension NSManagedObjectContext { @nonobjc internal func queryAttributes(_ from: CSFrom, _ selectClause: CSSelect, _ queryClauses: [CSQueryClause]) throws -> [[String: Any]] { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() try from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 - selectClause.applyToFetchRequest(fetchRequest as! NSFetchRequest) - queryClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } + selectClause.applyToFetchRequest(fetchRequest) + queryClauses.forEach { $0.applyToFetchRequest(fetchRequest) } return try self.queryAttributes(fetchRequest) } diff --git a/Sources/NSManagedObjectContext+Querying.swift b/Sources/NSManagedObjectContext+Querying.swift index fe8b05d..ada9e4c 100644 --- a/Sources/NSManagedObjectContext+Querying.swift +++ b/Sources/NSManagedObjectContext+Querying.swift @@ -109,7 +109,7 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { @nonobjc public func fetchOne(_ from: From, _ fetchClauses: [FetchClause]) throws -> D? { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() try from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 1 @@ -134,7 +134,7 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { @nonobjc public func fetchAll(_ from: From, _ fetchClauses: [FetchClause]) throws -> [D] { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() try from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 @@ -160,7 +160,7 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { @nonobjc public func fetchCount(_ from: From, _ fetchClauses: [FetchClause]) throws -> Int { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() try from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.resultType = .countResultType @@ -184,7 +184,7 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { @nonobjc public func fetchObjectID(_ from: From, _ fetchClauses: [FetchClause]) throws -> NSManagedObjectID? { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() try from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 1 @@ -209,7 +209,7 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { @nonobjc public func fetchObjectIDs(_ from: From, _ fetchClauses: [FetchClause]) throws -> [NSManagedObjectID] { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() try from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 @@ -226,7 +226,7 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { } @nonobjc - internal func fetchObjectIDs(_ fetchRequest: NSFetchRequest) throws -> [NSManagedObjectID] { + internal func fetchObjectIDs(_ fetchRequest: CoreStoreFetchRequest) throws -> [NSManagedObjectID] { var fetchResults: [NSManagedObjectID]? var fetchError: Error? @@ -234,7 +234,7 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { do { - fetchResults = try self.fetch(fetchRequest) + fetchResults = try self.fetch(fetchRequest.dynamicCast()) } catch { @@ -265,12 +265,12 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { @nonobjc public func queryValue(_ from: From, _ selectClause: Select, _ queryClauses: [QueryClause]) throws -> U? { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() try from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 - selectClause.applyToFetchRequest(fetchRequest) + selectClause.applyToFetchRequest(fetchRequest.staticCast()) queryClauses.forEach { $0.applyToFetchRequest(fetchRequest) } return try self.queryValue(selectClause.selectTerms, fetchRequest: fetchRequest) @@ -291,12 +291,12 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { @nonobjc public func queryAttributes(_ from: From, _ selectClause: Select, _ queryClauses: [QueryClause]) throws -> [[String: Any]] { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() try from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 - selectClause.applyToFetchRequest(fetchRequest) + selectClause.applyToFetchRequest(fetchRequest.staticCast()) queryClauses.forEach { $0.applyToFetchRequest(fetchRequest) } return try self.queryAttributes(fetchRequest) @@ -322,7 +322,7 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { @nonobjc internal func deleteAll(_ from: From, _ deleteClauses: [FetchClause]) throws -> Int { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() try from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 @@ -352,7 +352,7 @@ extension NSManagedObjectContext { // MARK: Fetching @nonobjc - internal func fetchOne(_ fetchRequest: NSFetchRequest) throws -> D? { + internal func fetchOne(_ fetchRequest: CoreStoreFetchRequest) throws -> D? { var fetchResults: [D]? var fetchError: Error? @@ -360,7 +360,7 @@ extension NSManagedObjectContext { do { - fetchResults = try self.fetch(fetchRequest) + fetchResults = try self.fetch(fetchRequest.staticCast()) } catch { @@ -380,7 +380,7 @@ extension NSManagedObjectContext { } @nonobjc - internal func fetchAll(_ fetchRequest: NSFetchRequest) throws -> [D] { + internal func fetchAll(_ fetchRequest: CoreStoreFetchRequest) throws -> [D] { var fetchResults: [D]? var fetchError: Error? @@ -388,7 +388,7 @@ extension NSManagedObjectContext { do { - fetchResults = try self.fetch(fetchRequest) + fetchResults = try self.fetch(fetchRequest.staticCast()) } catch { @@ -408,7 +408,7 @@ extension NSManagedObjectContext { } @nonobjc - internal func fetchCount(_ fetchRequest: NSFetchRequest) throws -> Int { + internal func fetchCount(_ fetchRequest: CoreStoreFetchRequest) throws -> Int { var count = 0 var countError: Error? @@ -416,7 +416,7 @@ extension NSManagedObjectContext { do { - count = try self.count(for: fetchRequest) + count = try self.count(for: fetchRequest.staticCast()) } catch { @@ -436,7 +436,7 @@ extension NSManagedObjectContext { } @nonobjc - internal func fetchObjectID(_ fetchRequest: NSFetchRequest) throws -> NSManagedObjectID? { + internal func fetchObjectID(_ fetchRequest: CoreStoreFetchRequest) throws -> NSManagedObjectID? { var fetchResults: [NSManagedObjectID]? var fetchError: Error? @@ -444,7 +444,7 @@ extension NSManagedObjectContext { do { - fetchResults = try self.fetch(fetchRequest) + fetchResults = try self.fetch(fetchRequest.staticCast()) } catch { @@ -467,7 +467,7 @@ extension NSManagedObjectContext { // MARK: Querying @nonobjc - internal func queryValue(_ selectTerms: [SelectTerm], fetchRequest: NSFetchRequest) throws -> U? { + internal func queryValue(_ selectTerms: [SelectTerm], fetchRequest: CoreStoreFetchRequest) throws -> U? { var fetchResults: [Any]? var fetchError: Error? @@ -475,7 +475,7 @@ extension NSManagedObjectContext { do { - fetchResults = try self.fetch(fetchRequest) + fetchResults = try self.fetch(fetchRequest.staticCast()) } catch { @@ -500,7 +500,7 @@ extension NSManagedObjectContext { } @nonobjc - internal func queryValue(_ selectTerms: [SelectTerm], fetchRequest: NSFetchRequest) throws -> Any? { + internal func queryValue(_ selectTerms: [SelectTerm], fetchRequest: CoreStoreFetchRequest) throws -> Any? { var fetchResults: [Any]? var fetchError: Error? @@ -508,7 +508,7 @@ extension NSManagedObjectContext { do { - fetchResults = try self.fetch(fetchRequest) + fetchResults = try self.fetch(fetchRequest.staticCast()) } catch { @@ -533,7 +533,7 @@ extension NSManagedObjectContext { } @nonobjc - internal func queryAttributes(_ fetchRequest: NSFetchRequest) throws -> [[String: Any]] { + internal func queryAttributes(_ fetchRequest: CoreStoreFetchRequest) throws -> [[String: Any]] { var fetchResults: [Any]? var fetchError: Error? @@ -541,7 +541,7 @@ extension NSManagedObjectContext { do { - fetchResults = try self.fetch(fetchRequest) + fetchResults = try self.fetch(fetchRequest.staticCast()) } catch { @@ -564,7 +564,7 @@ extension NSManagedObjectContext { // MARK: Deleting @nonobjc - internal func deleteAll(_ fetchRequest: NSFetchRequest) throws -> Int { + internal func deleteAll(_ fetchRequest: CoreStoreFetchRequest) throws -> Int { var numberOfDeletedObjects: Int? var fetchError: Error? @@ -574,7 +574,7 @@ extension NSManagedObjectContext { do { - let fetchResults = try self.fetch(fetchRequest) + let fetchResults = try self.fetch(fetchRequest.staticCast()) for object in fetchResults { self.delete(object) diff --git a/Sources/ObjectMonitor.swift b/Sources/ObjectMonitor.swift index 2c06782..df9518b 100644 --- a/Sources/ObjectMonitor.swift +++ b/Sources/ObjectMonitor.swift @@ -261,7 +261,7 @@ public final class ObjectMonitor: Equatable { private init(context: NSManagedObjectContext, object: ObjectType) { let objectID = object.cs_id() - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() fetchRequest.entity = objectID.entity fetchRequest.fetchLimit = 0 fetchRequest.resultType = .managedObjectResultType