From b9a2f96d6e2306543c27803fbf2ed7bab776dade Mon Sep 17 00:00:00 2001 From: John Rommel Estropia Date: Sat, 7 May 2016 12:04:59 +0800 Subject: [PATCH 1/3] renamed refreshAllObjectsAsFaults to refreshAndMergeAllObjects, which is more correct --- CoreStore/Internal/NSManagedObjectContext+Transaction.swift | 4 ++-- CoreStore/Saving and Processing/BaseDataTransaction.swift | 4 ++-- CoreStore/Saving and Processing/CoreStore+Transaction.swift | 4 ++-- CoreStore/Saving and Processing/DataStack+Transaction.swift | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/CoreStore/Internal/NSManagedObjectContext+Transaction.swift b/CoreStore/Internal/NSManagedObjectContext+Transaction.swift index e64332c..8a911a1 100644 --- a/CoreStore/Internal/NSManagedObjectContext+Transaction.swift +++ b/CoreStore/Internal/NSManagedObjectContext+Transaction.swift @@ -167,7 +167,7 @@ internal extension NSManagedObjectContext { } } - internal func refreshAllObjectsAsFaults() { + internal func refreshAndMergeAllObjects() { if #available(iOS 8.3, OSX 10.11, *) { @@ -175,7 +175,7 @@ internal extension NSManagedObjectContext { } else { - self.registeredObjects.forEach { self.refreshObject($0, mergeChanges: false) } + self.registeredObjects.forEach { self.refreshObject($0, mergeChanges: true) } } } diff --git a/CoreStore/Saving and Processing/BaseDataTransaction.swift b/CoreStore/Saving and Processing/BaseDataTransaction.swift index 20d9fb8..54778d3 100644 --- a/CoreStore/Saving and Processing/BaseDataTransaction.swift +++ b/CoreStore/Saving and Processing/BaseDataTransaction.swift @@ -191,14 +191,14 @@ public /*abstract*/ class BaseDataTransaction { /** Refreshes all registered objects `NSManagedObject`s in the transaction. */ - public func refreshAllObjectsAsFaults() { + public func refreshAndMergeAllObjects() { CoreStore.assert( self.isRunningInAllowedQueue(), "Attempted to refresh entities outside their designated queue." ) - self.context.refreshAllObjectsAsFaults() + self.context.refreshAndMergeAllObjects() } diff --git a/CoreStore/Saving and Processing/CoreStore+Transaction.swift b/CoreStore/Saving and Processing/CoreStore+Transaction.swift index 2023d46..b1cf3d8 100644 --- a/CoreStore/Saving and Processing/CoreStore+Transaction.swift +++ b/CoreStore/Saving and Processing/CoreStore+Transaction.swift @@ -66,9 +66,9 @@ public extension CoreStore { /** Refreshes all registered objects `NSManagedObject`s in the `DataStack`. */ - public static func refreshAllObjectsAsFaults() { + public static func refreshAndMergeAllObjects() { - self.defaultStack.refreshAllObjectsAsFaults() + self.defaultStack.refreshAndMergeAllObjects() } @available(*, deprecated=1.3.1, renamed="beginUnsafe") diff --git a/CoreStore/Saving and Processing/DataStack+Transaction.swift b/CoreStore/Saving and Processing/DataStack+Transaction.swift index 9277d8b..80bcb7c 100644 --- a/CoreStore/Saving and Processing/DataStack+Transaction.swift +++ b/CoreStore/Saving and Processing/DataStack+Transaction.swift @@ -83,14 +83,14 @@ public extension DataStack { /** Refreshes all registered objects `NSManagedObject`s in the `DataStack`. */ - public func refreshAllObjectsAsFaults() { + public func refreshAndMergeAllObjects() { CoreStore.assert( NSThread.isMainThread(), "Attempted to refresh entities outside their designated queue." ) - self.mainContext.refreshAllObjectsAsFaults() + self.mainContext.refreshAndMergeAllObjects() } @available(*, deprecated=1.3.1, renamed="beginUnsafe") From 26ae6293cabf2b9230efae86a3bcd07b7bfc4dde Mon Sep 17 00:00:00 2001 From: John Rommel Estropia Date: Sat, 7 May 2016 12:18:54 +0800 Subject: [PATCH 2/3] merge changes to main context synchronously or asynchronously depending on the caller intention (fixes #65) --- .../NSManagedObjectContext+Setup.swift | 20 ++++++++++++--- .../NSManagedObjectContext+Transaction.swift | 25 +++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/CoreStore/Internal/NSManagedObjectContext+Setup.swift b/CoreStore/Internal/NSManagedObjectContext+Setup.swift index 6a06676..4438c74 100644 --- a/CoreStore/Internal/NSManagedObjectContext+Setup.swift +++ b/CoreStore/Internal/NSManagedObjectContext+Setup.swift @@ -82,14 +82,28 @@ internal extension NSManagedObjectContext { object: rootContext, closure: { [weak context] (note) -> Void in - context?.performBlock { () -> Void in + guard let rootContext = note.object as? NSManagedObjectContext, + let context = context else { + + return + } + let mergeChanges = { () -> Void in let updatedObjects = (note.userInfo?[NSUpdatedObjectsKey] as? Set) ?? [] for object in updatedObjects { - context?.objectWithID(object.objectID).willAccessValueForKey(nil) + context.objectWithID(object.objectID).willAccessValueForKey(nil) } - context?.mergeChangesFromContextDidSaveNotification(note) + context.mergeChangesFromContextDidSaveNotification(note) + } + + if rootContext.isSavingSynchronously == true { + + context.performBlockAndWait(mergeChanges) + } + else { + + context.performBlock(mergeChanges) } } ) diff --git a/CoreStore/Internal/NSManagedObjectContext+Transaction.swift b/CoreStore/Internal/NSManagedObjectContext+Transaction.swift index 8a911a1..9415689 100644 --- a/CoreStore/Internal/NSManagedObjectContext+Transaction.swift +++ b/CoreStore/Internal/NSManagedObjectContext+Transaction.swift @@ -55,6 +55,26 @@ internal extension NSManagedObjectContext { } } + internal var isSavingSynchronously: Bool? { + + get { + + let value: NSNumber? = getAssociatedObjectForKey( + &PropertyKeys.isSavingSynchronously, + inObject: self + ) + return value?.boolValue + } + set { + + setAssociatedWeakObject( + newValue.flatMap { NSNumber(bool: $0) }, + forKey: &PropertyKeys.isSavingSynchronously, + inObject: self + ) + } + } + internal func isRunningInAllowedQueue() -> Bool { guard let parentTransaction = self.parentTransaction else { @@ -89,7 +109,9 @@ internal extension NSManagedObjectContext { do { + self.isSavingSynchronously = true try self.save() + self.isSavingSynchronously = nil } catch { @@ -137,7 +159,9 @@ internal extension NSManagedObjectContext { do { + self.isSavingSynchronously = false try self.save() + self.isSavingSynchronously = nil } catch { @@ -185,5 +209,6 @@ internal extension NSManagedObjectContext { private struct PropertyKeys { static var parentTransaction: Void? + static var isSavingSynchronously: Void? } } From c990f7764a39cc28ac5f8e0f74ec632f6c78b088 Mon Sep 17 00:00:00 2001 From: John Rommel Estropia Date: Sat, 7 May 2016 12:19:30 +0800 Subject: [PATCH 3/3] version bump --- CoreStore.podspec | 2 +- CoreStore/Info.plist | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CoreStore.podspec b/CoreStore.podspec index e2bdccc..4dc6754 100644 --- a/CoreStore.podspec +++ b/CoreStore.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "CoreStore" - s.version = "1.6.4" + s.version = "1.6.5" s.license = "MIT" s.summary = "Unleashing the real power of Core Data with the elegance and safety of Swift" s.homepage = "https://github.com/JohnEstropia/CoreStore" diff --git a/CoreStore/Info.plist b/CoreStore/Info.plist index f1ed6f9..336748b 100644 --- a/CoreStore/Info.plist +++ b/CoreStore/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.6.4 + 1.6.5 CFBundleSignature ???? CFBundleVersion