mirror of
https://github.com/JohnEstropia/CoreStore.git
synced 2026-03-30 14:21:49 +02:00
Reduce leaking (a little) on the workaround for NSFetchRequest.affectedStores ARC bug
This commit is contained in:
@@ -74,33 +74,33 @@ final class FromTests: BaseTestCase {
|
|||||||
|
|
||||||
let from = From<TestEntity1>()
|
let from = From<TestEntity1>()
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
XCTAssertTrue(storesFound)
|
XCTAssertTrue(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
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"])
|
XCTAssertEqual(affectedConfigurations, ["PF_DEFAULT_CONFIGURATION_NAME"])
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
|
||||||
let from = From<TestEntity1>("Config1")
|
let from = From<TestEntity1>("Config1")
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = self.expectLogger([.LogWarning]) {
|
let storesFound = self.expectLogger([.LogWarning]) {
|
||||||
|
|
||||||
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
}
|
}
|
||||||
XCTAssertFalse(storesFound)
|
XCTAssertFalse(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
||||||
|
|
||||||
let affectedConfigurations = request.affectedStores!.map { $0.configurationName }
|
let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName }
|
||||||
XCTAssertTrue(affectedConfigurations.isEmpty)
|
XCTAssertTrue(affectedConfigurations.isEmpty)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -115,102 +115,102 @@ final class FromTests: BaseTestCase {
|
|||||||
|
|
||||||
let from = From<TestEntity1>()
|
let from = From<TestEntity1>()
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
XCTAssertTrue(storesFound)
|
XCTAssertTrue(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
||||||
|
|
||||||
let affectedConfigurations = request.affectedStores!.map { $0.configurationName }
|
let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName }
|
||||||
XCTAssertEqual(affectedConfigurations, ["Config1"])
|
XCTAssertEqual(affectedConfigurations, ["Config1"])
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
|
||||||
let from = From<TestEntity1>("Config1")
|
let from = From<TestEntity1>("Config1")
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
XCTAssertTrue(storesFound)
|
XCTAssertTrue(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
||||||
|
|
||||||
let affectedConfigurations = request.affectedStores!.map { $0.configurationName }
|
let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName }
|
||||||
XCTAssertEqual(affectedConfigurations, ["Config1"])
|
XCTAssertEqual(affectedConfigurations, ["Config1"])
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
|
||||||
let from = From<TestEntity1>("Config2")
|
let from = From<TestEntity1>("Config2")
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = self.expectLogger([.LogWarning]) {
|
let storesFound = self.expectLogger([.LogWarning]) {
|
||||||
|
|
||||||
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
}
|
}
|
||||||
XCTAssertFalse(storesFound)
|
XCTAssertFalse(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
||||||
|
|
||||||
let affectedConfigurations = request.affectedStores!.map { $0.configurationName }
|
let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName }
|
||||||
XCTAssertTrue(affectedConfigurations.isEmpty)
|
XCTAssertTrue(affectedConfigurations.isEmpty)
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
|
||||||
let from = From<TestEntity2>()
|
let from = From<TestEntity2>()
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = self.expectLogger([.LogWarning]) {
|
let storesFound = self.expectLogger([.LogWarning]) {
|
||||||
|
|
||||||
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
}
|
}
|
||||||
XCTAssertFalse(storesFound)
|
XCTAssertFalse(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
||||||
|
|
||||||
let affectedConfigurations = request.affectedStores!.map { $0.configurationName }
|
let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName }
|
||||||
XCTAssertTrue(affectedConfigurations.isEmpty)
|
XCTAssertTrue(affectedConfigurations.isEmpty)
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
|
||||||
let from = From<TestEntity2>("Config1")
|
let from = From<TestEntity2>("Config1")
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = self.expectLogger([.LogWarning]) {
|
let storesFound = self.expectLogger([.LogWarning]) {
|
||||||
|
|
||||||
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
}
|
}
|
||||||
XCTAssertFalse(storesFound)
|
XCTAssertFalse(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
||||||
|
|
||||||
let affectedConfigurations = request.affectedStores!.map { $0.configurationName }
|
let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName }
|
||||||
XCTAssertTrue(affectedConfigurations.isEmpty)
|
XCTAssertTrue(affectedConfigurations.isEmpty)
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
|
||||||
let from = From<TestEntity2>("Config2")
|
let from = From<TestEntity2>("Config2")
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = self.expectLogger([.LogWarning]) {
|
let storesFound = self.expectLogger([.LogWarning]) {
|
||||||
|
|
||||||
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
}
|
}
|
||||||
XCTAssertFalse(storesFound)
|
XCTAssertFalse(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
||||||
|
|
||||||
let affectedConfigurations = request.affectedStores!.map { $0.configurationName }
|
let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName }
|
||||||
XCTAssertTrue(affectedConfigurations.isEmpty)
|
XCTAssertTrue(affectedConfigurations.isEmpty)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -225,99 +225,99 @@ final class FromTests: BaseTestCase {
|
|||||||
|
|
||||||
let from = From<TestEntity1>()
|
let from = From<TestEntity1>()
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
XCTAssertTrue(storesFound)
|
XCTAssertTrue(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
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)
|
XCTAssertEqual(Set(affectedConfigurations), ["PF_DEFAULT_CONFIGURATION_NAME", "Config1"] as Set)
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
|
||||||
let from = From<TestEntity1>("Config1")
|
let from = From<TestEntity1>("Config1")
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
XCTAssertTrue(storesFound)
|
XCTAssertTrue(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
||||||
|
|
||||||
let affectedConfigurations = request.affectedStores!.map { $0.configurationName }
|
let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName }
|
||||||
XCTAssertEqual(affectedConfigurations, ["Config1"])
|
XCTAssertEqual(affectedConfigurations, ["Config1"])
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
|
||||||
let from = From<TestEntity1>("Config2")
|
let from = From<TestEntity1>("Config2")
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = self.expectLogger([.LogWarning]) {
|
let storesFound = self.expectLogger([.LogWarning]) {
|
||||||
|
|
||||||
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
}
|
}
|
||||||
XCTAssertFalse(storesFound)
|
XCTAssertFalse(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
||||||
|
|
||||||
let affectedConfigurations = request.affectedStores!.map { $0.configurationName }
|
let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName }
|
||||||
XCTAssertTrue(affectedConfigurations.isEmpty)
|
XCTAssertTrue(affectedConfigurations.isEmpty)
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
|
||||||
let from = From<TestEntity2>()
|
let from = From<TestEntity2>()
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
XCTAssertTrue(storesFound)
|
XCTAssertTrue(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
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"])
|
XCTAssertEqual(affectedConfigurations, ["PF_DEFAULT_CONFIGURATION_NAME"])
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
|
||||||
let from = From<TestEntity2>("Config1")
|
let from = From<TestEntity2>("Config1")
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = self.expectLogger([.LogWarning]) {
|
let storesFound = self.expectLogger([.LogWarning]) {
|
||||||
|
|
||||||
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
}
|
}
|
||||||
XCTAssertFalse(storesFound)
|
XCTAssertFalse(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
||||||
|
|
||||||
let affectedConfigurations = request.affectedStores!.map { $0.configurationName }
|
let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName }
|
||||||
XCTAssertTrue(affectedConfigurations.isEmpty)
|
XCTAssertTrue(affectedConfigurations.isEmpty)
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
|
||||||
let from = From<TestEntity2>("Config2")
|
let from = From<TestEntity2>("Config2")
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = self.expectLogger([.LogWarning]) {
|
let storesFound = self.expectLogger([.LogWarning]) {
|
||||||
|
|
||||||
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
}
|
}
|
||||||
XCTAssertFalse(storesFound)
|
XCTAssertFalse(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
||||||
|
|
||||||
let affectedConfigurations = request.affectedStores!.map { $0.configurationName }
|
let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName }
|
||||||
XCTAssertTrue(affectedConfigurations.isEmpty)
|
XCTAssertTrue(affectedConfigurations.isEmpty)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -332,96 +332,96 @@ final class FromTests: BaseTestCase {
|
|||||||
|
|
||||||
let from = From<TestEntity1>()
|
let from = From<TestEntity1>()
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
XCTAssertTrue(storesFound)
|
XCTAssertTrue(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
||||||
|
|
||||||
let affectedConfigurations = request.affectedStores!.map { $0.configurationName }
|
let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName }
|
||||||
XCTAssertEqual(affectedConfigurations, ["Config1"])
|
XCTAssertEqual(affectedConfigurations, ["Config1"])
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
|
||||||
let from = From<TestEntity1>("Config1")
|
let from = From<TestEntity1>("Config1")
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
XCTAssertTrue(storesFound)
|
XCTAssertTrue(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
||||||
|
|
||||||
let affectedConfigurations = request.affectedStores!.map { $0.configurationName }
|
let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName }
|
||||||
XCTAssertEqual(affectedConfigurations, ["Config1"])
|
XCTAssertEqual(affectedConfigurations, ["Config1"])
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
|
||||||
let from = From<TestEntity1>("Config2")
|
let from = From<TestEntity1>("Config2")
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = self.expectLogger([.LogWarning]) {
|
let storesFound = self.expectLogger([.LogWarning]) {
|
||||||
|
|
||||||
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
}
|
}
|
||||||
XCTAssertFalse(storesFound)
|
XCTAssertFalse(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
||||||
|
|
||||||
let affectedConfigurations = request.affectedStores!.map { $0.configurationName }
|
let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName }
|
||||||
XCTAssertTrue(affectedConfigurations.isEmpty)
|
XCTAssertTrue(affectedConfigurations.isEmpty)
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
|
||||||
let from = From<TestEntity2>()
|
let from = From<TestEntity2>()
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
XCTAssertTrue(storesFound)
|
XCTAssertTrue(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
||||||
|
|
||||||
let affectedConfigurations = request.affectedStores!.map { $0.configurationName }
|
let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName }
|
||||||
XCTAssertEqual(affectedConfigurations, ["Config2"])
|
XCTAssertEqual(affectedConfigurations, ["Config2"])
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
|
||||||
let from = From<TestEntity2>("Config1")
|
let from = From<TestEntity2>("Config1")
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = self.expectLogger([.LogWarning]) {
|
let storesFound = self.expectLogger([.LogWarning]) {
|
||||||
|
|
||||||
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
}
|
}
|
||||||
XCTAssertFalse(storesFound)
|
XCTAssertFalse(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
||||||
|
|
||||||
let affectedConfigurations = request.affectedStores!.map { $0.configurationName }
|
let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName }
|
||||||
XCTAssertTrue(affectedConfigurations.isEmpty)
|
XCTAssertTrue(affectedConfigurations.isEmpty)
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
|
||||||
let from = From<TestEntity2>("Config2")
|
let from = From<TestEntity2>("Config2")
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
let storesFound = from.applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
XCTAssertTrue(storesFound)
|
XCTAssertTrue(storesFound)
|
||||||
XCTAssertNotNil(request.entity)
|
XCTAssertNotNil(request.entity)
|
||||||
XCTAssertNotNil(request.affectedStores)
|
XCTAssertNotNil(request.safeAffectedStores)
|
||||||
|
|
||||||
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName))
|
||||||
|
|
||||||
let affectedConfigurations = request.affectedStores!.map { $0.configurationName }
|
let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName }
|
||||||
XCTAssertEqual(affectedConfigurations, ["Config2"])
|
XCTAssertEqual(affectedConfigurations, ["Config2"])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ final class GroupByTests: BaseTestCase {
|
|||||||
|
|
||||||
let groupBy = GroupBy("testString")
|
let groupBy = GroupBy("testString")
|
||||||
|
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
_ = From(TestEntity1).applyToFetchRequest(request, context: dataStack.mainContext)
|
_ = From(TestEntity1).applyToFetchRequest(request, context: dataStack.mainContext)
|
||||||
groupBy.applyToFetchRequest(request)
|
groupBy.applyToFetchRequest(request)
|
||||||
|
|
||||||
|
|||||||
@@ -179,7 +179,7 @@ final class OrderByTests: XCTestCase {
|
|||||||
dynamic func test_ThatOrderByClauses_ApplyToFetchRequestsCorrectly() {
|
dynamic func test_ThatOrderByClauses_ApplyToFetchRequestsCorrectly() {
|
||||||
|
|
||||||
let orderBy = OrderBy(.Ascending("key"))
|
let orderBy = OrderBy(.Ascending("key"))
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
orderBy.applyToFetchRequest(request)
|
orderBy.applyToFetchRequest(request)
|
||||||
XCTAssertNotNil(request.sortDescriptors)
|
XCTAssertNotNil(request.sortDescriptors)
|
||||||
XCTAssertEqual(request.sortDescriptors ?? [], orderBy.sortDescriptors)
|
XCTAssertEqual(request.sortDescriptors ?? [], orderBy.sortDescriptors)
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ final class TweakTests: XCTestCase {
|
|||||||
$0.fetchLimit = 200
|
$0.fetchLimit = 200
|
||||||
$0.predicate = predicate
|
$0.predicate = predicate
|
||||||
}
|
}
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
tweak.applyToFetchRequest(request)
|
tweak.applyToFetchRequest(request)
|
||||||
XCTAssertEqual(request.fetchOffset, 100)
|
XCTAssertEqual(request.fetchOffset, 100)
|
||||||
XCTAssertEqual(request.fetchLimit, 200)
|
XCTAssertEqual(request.fetchLimit, 200)
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ final class WhereTests: XCTestCase {
|
|||||||
dynamic func test_ThatWhereClauses_ApplyToFetchRequestsCorrectly() {
|
dynamic func test_ThatWhereClauses_ApplyToFetchRequestsCorrectly() {
|
||||||
|
|
||||||
let whereClause = Where("key", isEqualTo: "value")
|
let whereClause = Where("key", isEqualTo: "value")
|
||||||
let request = NSFetchRequest()
|
let request = CoreStoreFetchRequest()
|
||||||
whereClause.applyToFetchRequest(request)
|
whereClause.applyToFetchRequest(request)
|
||||||
XCTAssertNotNil(request.predicate)
|
XCTAssertNotNil(request.predicate)
|
||||||
XCTAssertEqual(request.predicate, whereClause.predicate)
|
XCTAssertEqual(request.predicate, whereClause.predicate)
|
||||||
|
|||||||
@@ -576,6 +576,9 @@ CSWhere *_Nonnull CSWherePredicate(NSPredicate *_Nonnull predicate) CORESTORE_RE
|
|||||||
// http://stackoverflow.com/questions/14396375/nsfetchedresultscontroller-crashes-in-ios-6-if-affectedstores-is-specified
|
// http://stackoverflow.com/questions/14396375/nsfetchedresultscontroller-crashes-in-ios-6-if-affectedstores-is-specified
|
||||||
NS_SWIFT_NAME(CoreStoreFetchRequest)
|
NS_SWIFT_NAME(CoreStoreFetchRequest)
|
||||||
@interface _CSFetchRequest: NSFetchRequest
|
@interface _CSFetchRequest: NSFetchRequest
|
||||||
|
|
||||||
|
@property (nullable, nonatomic, copy, readonly) NSArray<NSPersistentStore *> *safeAffectedStores;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -223,16 +223,35 @@ CSWhere *_Nonnull CSWherePredicate(NSPredicate *_Nonnull predicate) CORESTORE_RE
|
|||||||
#pragma mark CoreStoreFetchRequest
|
#pragma mark CoreStoreFetchRequest
|
||||||
|
|
||||||
@interface _CSFetchRequest ()
|
@interface _CSFetchRequest ()
|
||||||
|
|
||||||
|
@property (nullable, nonatomic, copy) NSArray<NSPersistentStore *> *safeAffectedStores;
|
||||||
|
@property (nullable, nonatomic, assign) CFArrayRef releaseArray;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation _CSFetchRequest
|
@implementation _CSFetchRequest
|
||||||
|
|
||||||
- (NSArray<NSPersistentStore *> *)affectedStores {
|
// MARK: NSFetchRequest
|
||||||
|
|
||||||
|
- (void)setAffectedStores:(NSArray<NSPersistentStore *> *_Nullable)affectedStores {
|
||||||
|
|
||||||
// Bugfix for NSFetchRequest messing up memory management for `affectedStores`
|
// Bugfix for NSFetchRequest messing up memory management for `affectedStores`
|
||||||
// http://stackoverflow.com/questions/14396375/nsfetchedresultscontroller-crashes-in-ios-6-if-affectedstores-is-specified
|
// http://stackoverflow.com/questions/14396375/nsfetchedresultscontroller-crashes-in-ios-6-if-affectedstores-is-specified
|
||||||
CFBridgingRetain([super affectedStores]);
|
|
||||||
return [super affectedStores];
|
if (NSFoundationVersionNumber < NSFoundationVersionNumber10_0) {
|
||||||
|
|
||||||
|
self.safeAffectedStores = affectedStores;
|
||||||
|
[super setAffectedStores:affectedStores];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (self.releaseArray != NULL) {
|
||||||
|
|
||||||
|
CFRelease(self.releaseArray);
|
||||||
|
self.releaseArray = NULL;
|
||||||
|
}
|
||||||
|
self.safeAffectedStores = affectedStores;
|
||||||
|
[super setAffectedStores:affectedStores];
|
||||||
|
self.releaseArray = CFBridgingRetain([super affectedStores]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -1123,7 +1123,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
|
|||||||
self.isPersistentStoreChanging = true
|
self.isPersistentStoreChanging = true
|
||||||
|
|
||||||
guard let removedStores = (note.userInfo?[NSRemovedPersistentStoresKey] as? [NSPersistentStore]).flatMap(Set.init)
|
guard let removedStores = (note.userInfo?[NSRemovedPersistentStoresKey] as? [NSPersistentStore]).flatMap(Set.init)
|
||||||
where !Set(self.fetchedResultsController.fetchRequest.affectedStores ?? []).intersect(removedStores).isEmpty else {
|
where !Set((self.fetchedResultsController.fetchRequest as! CoreStoreFetchRequest).safeAffectedStores ?? []).intersect(removedStores).isEmpty else {
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -1144,7 +1144,7 @@ public final class ListMonitor<T: NSManagedObject>: Hashable {
|
|||||||
|
|
||||||
if !self.isPendingRefetch {
|
if !self.isPendingRefetch {
|
||||||
|
|
||||||
let previousStores = Set(self.fetchedResultsController.fetchRequest.affectedStores ?? [])
|
let previousStores = Set((self.fetchedResultsController.fetchRequest as! CoreStoreFetchRequest).safeAffectedStores ?? [])
|
||||||
let currentStores = previousStores
|
let currentStores = previousStores
|
||||||
.subtract(note.userInfo?[NSRemovedPersistentStoresKey] as? [NSPersistentStore] ?? [])
|
.subtract(note.userInfo?[NSRemovedPersistentStoresKey] as? [NSPersistentStore] ?? [])
|
||||||
.union(note.userInfo?[NSAddedPersistentStoresKey] as? [NSPersistentStore] ?? [])
|
.union(note.userInfo?[NSAddedPersistentStoresKey] as? [NSPersistentStore] ?? [])
|
||||||
|
|||||||
Reference in New Issue
Block a user