diff --git a/CoreStore/Internal/CoreStoreFetchedResultsController.swift b/CoreStore/Internal/CoreStoreFetchedResultsController.swift index 1286713..cb6c7e2 100644 --- a/CoreStore/Internal/CoreStoreFetchedResultsController.swift +++ b/CoreStore/Internal/CoreStoreFetchedResultsController.swift @@ -104,3 +104,19 @@ internal final class CoreStoreFetchedResultsController: NSFe private let reapplyAffectedStores: (fetchRequest: NSFetchRequest, context: NSManagedObjectContext) -> Bool } + + +// 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 { + + override var affectedStores: [NSPersistentStore]? { + + get { return self.safeAffectedStores } + set { self.safeAffectedStores = newValue } + } + + private var safeAffectedStores: [NSPersistentStore]? +} diff --git a/CoreStore/Internal/NSManagedObjectContext+Querying.swift b/CoreStore/Internal/NSManagedObjectContext+Querying.swift index 7beb916..5547940 100644 --- a/CoreStore/Internal/NSManagedObjectContext+Querying.swift +++ b/CoreStore/Internal/NSManagedObjectContext+Querying.swift @@ -76,7 +76,7 @@ internal extension NSManagedObjectContext { internal func fetchOne(from: From, _ fetchClauses: [FetchClause]) -> T? { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 1 @@ -119,7 +119,7 @@ internal extension NSManagedObjectContext { internal func fetchAll(from: From, _ fetchClauses: [FetchClause]) -> [T]? { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 @@ -162,7 +162,7 @@ internal extension NSManagedObjectContext { internal func fetchCount(from: From, _ fetchClauses: [FetchClause]) -> Int? { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() from.applyToFetchRequest(fetchRequest, context: self) for clause in fetchClauses { @@ -195,7 +195,7 @@ internal extension NSManagedObjectContext { internal func fetchObjectID(from: From, _ fetchClauses: [FetchClause]) -> NSManagedObjectID? { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 1 @@ -238,7 +238,7 @@ internal extension NSManagedObjectContext { internal func fetchObjectIDs(from: From, _ fetchClauses: [FetchClause]) -> [NSManagedObjectID]? { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 @@ -281,7 +281,7 @@ internal extension NSManagedObjectContext { internal func deleteAll(from: From, _ deleteClauses: [DeleteClause]) -> Int? { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 @@ -334,7 +334,7 @@ internal extension NSManagedObjectContext { internal func queryValue(from: From, _ selectClause: Select, _ queryClauses: [QueryClause]) -> U? { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 @@ -383,7 +383,7 @@ internal extension NSManagedObjectContext { internal func queryAttributes(from: From, _ selectClause: Select, _ queryClauses: [QueryClause]) -> [[NSString: AnyObject]]? { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 diff --git a/CoreStore/Observing/ListMonitor.swift b/CoreStore/Observing/ListMonitor.swift index d0c5bf5..2c6b748 100644 --- a/CoreStore/Observing/ListMonitor.swift +++ b/CoreStore/Observing/ListMonitor.swift @@ -991,7 +991,7 @@ public final class ListMonitor { private init(context: NSManagedObjectContext, transactionQueue: GCDQueue, from: From, sectionBy: SectionBy?, fetchClauses: [FetchClause], createAsynchronously: ((ListMonitor) -> Void)?) { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() fetchRequest.fetchLimit = 0 fetchRequest.resultType = .ManagedObjectResultType fetchRequest.fetchBatchSize = 20 diff --git a/CoreStore/Observing/ObjectMonitor.swift b/CoreStore/Observing/ObjectMonitor.swift index c3f16b8..81e3717 100644 --- a/CoreStore/Observing/ObjectMonitor.swift +++ b/CoreStore/Observing/ObjectMonitor.swift @@ -175,7 +175,7 @@ public final class ObjectMonitor { private init(context: NSManagedObjectContext, object: T) { - let fetchRequest = NSFetchRequest() + let fetchRequest = CoreStoreFetchRequest() fetchRequest.entity = object.entity fetchRequest.fetchLimit = 0 fetchRequest.resultType = .ManagedObjectResultType