From c3ef8a417274d66f9cd7b2d496fd67037d80287b Mon Sep 17 00:00:00 2001 From: John Estropia Date: Thu, 27 Aug 2015 17:28:40 +0900 Subject: [PATCH] bug fix for dictionaries getting deallocated earlier --- .../Concrete Clauses/Where.swift | 30 ++++++++++++++++--- .../BaseDataTransaction+Importing.swift | 14 ++++++--- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/CoreStore/Fetching and Querying/Concrete Clauses/Where.swift b/CoreStore/Fetching and Querying/Concrete Clauses/Where.swift index 1762b31..6e3928c 100644 --- a/CoreStore/Fetching and Querying/Concrete Clauses/Where.swift +++ b/CoreStore/Fetching and Querying/Concrete Clauses/Where.swift @@ -102,16 +102,38 @@ public struct Where: FetchClause, QueryClause, DeleteClause { } /** - Initializes a `Where` clause with a predicate using the specified string format and arguments + Initializes a `Where` clause that compares equality - - parameter format: the format string for the predicate - - parameter argumentArray: the arguments for `format` + - parameter keyPath: the keyPath to compare with + - parameter value: the arguments for the `==` operator */ public init(_ keyPath: KeyPath, isEqualTo value: NSObject?) { self.init(value == nil ? NSPredicate(format: "\(keyPath) == nil") - : NSPredicate(format: "\(keyPath) == %@", value!)) + : NSPredicate(format: "\(keyPath) == %@", argumentArray: [value!])) + } + + /** + Initializes a `Where` clause that compares membership + + - parameter keyPath: the keyPath to compare with + - parameter list: the array to check membership of + */ + public init(_ keyPath: KeyPath, isMemberOf list: NSArray) { + + self.init(NSPredicate(format: "\(keyPath) IN %@", list)) + } + + /** + Initializes a `Where` clause that compares membership + + - parameter keyPath: the keyPath to compare with + - parameter list: the sequence to check membership of + */ + public init(_ keyPath: KeyPath, isMemberOf list: S) { + + self.init(NSPredicate(format: "\(keyPath) IN %@", Array(list) as NSArray)) } public let predicate: NSPredicate diff --git a/CoreStore/Importing Data/BaseDataTransaction+Importing.swift b/CoreStore/Importing Data/BaseDataTransaction+Importing.swift index 8bc5598..40b2637 100644 --- a/CoreStore/Importing Data/BaseDataTransaction+Importing.swift +++ b/CoreStore/Importing Data/BaseDataTransaction+Importing.swift @@ -221,15 +221,18 @@ public extension BaseDataTransaction { } } + var mappingCopy = mapping // bugfix: prevent deallocation of exhausted items when accessed lazily with .keys and .values if let preProcess = preProcess { try autoreleasepool { - try preProcess(mapping: &mapping) + try preProcess(mapping: &mappingCopy) } } + mapping = mappingCopy - for object in self.fetchAll(From(T), Where("%K IN %@", T.uniqueIDKeyPath, Array(mapping.keys))) ?? [] { + var mappingCopyForKeys = mapping + for object in self.fetchAll(From(T), Where(T.uniqueIDKeyPath, isMemberOf: mappingCopyForKeys.keys)) ?? [] { try autoreleasepool { @@ -291,16 +294,19 @@ public extension BaseDataTransaction { } } + var mappingCopy = mapping // bugfix: prevent deallocation of exhausted items when accessed lazily with .keys and .values if let preProcess = preProcess { try autoreleasepool { - try preProcess(mapping: &mapping) + try preProcess(mapping: &mappingCopy) } } + mapping = mappingCopy + var mappingCopyForKeys = mapping var objects = Dictionary() - for object in self.fetchAll(From(T), Where("%K IN %@", T.uniqueIDKeyPath, Array(mapping.keys))) ?? [] { + for object in self.fetchAll(From(T), Where(T.uniqueIDKeyPath, isMemberOf: mappingCopyForKeys.keys)) ?? [] { try autoreleasepool {