mirror of
https://github.com/JohnEstropia/CoreStore.git
synced 2026-03-31 22:53:04 +02:00
Merge branch 'master' into corestore2_develop
# Conflicts: # CoreStore.podspec # Sources/Info.plist # Sources/Internal/NSManagedObjectContext+Transaction.swift
This commit is contained in:
@@ -100,14 +100,28 @@ internal extension NSManagedObjectContext {
|
|||||||
object: rootContext,
|
object: rootContext,
|
||||||
closure: { [weak context] (note) -> Void in
|
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<NSManagedObject>) ?? []
|
let updatedObjects = (note.userInfo?[NSUpdatedObjectsKey] as? Set<NSManagedObject>) ?? []
|
||||||
for object in updatedObjects {
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -56,6 +56,27 @@ internal extension NSManagedObjectContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@nonobjc
|
||||||
|
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
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@nonobjc
|
@nonobjc
|
||||||
internal func isRunningInAllowedQueue() -> Bool {
|
internal func isRunningInAllowedQueue() -> Bool {
|
||||||
|
|
||||||
@@ -93,7 +114,9 @@ internal extension NSManagedObjectContext {
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
|
self.isSavingSynchronously = true
|
||||||
try self.save()
|
try self.save()
|
||||||
|
self.isSavingSynchronously = nil
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
|
|
||||||
@@ -142,7 +165,9 @@ internal extension NSManagedObjectContext {
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
|
self.isSavingSynchronously = false
|
||||||
try self.save()
|
try self.save()
|
||||||
|
self.isSavingSynchronously = nil
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
|
|
||||||
@@ -173,7 +198,7 @@ internal extension NSManagedObjectContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@nonobjc
|
@nonobjc
|
||||||
internal func refreshAllObjectsAsFaults() {
|
internal func refreshAndMergeAllObjects() {
|
||||||
|
|
||||||
if #available(iOS 8.3, OSX 10.11, *) {
|
if #available(iOS 8.3, OSX 10.11, *) {
|
||||||
|
|
||||||
@@ -181,7 +206,7 @@ internal extension NSManagedObjectContext {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
self.registeredObjects.forEach { self.refreshObject($0, mergeChanges: false) }
|
self.registeredObjects.forEach { self.refreshObject($0, mergeChanges: true) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -191,5 +216,6 @@ internal extension NSManagedObjectContext {
|
|||||||
private struct PropertyKeys {
|
private struct PropertyKeys {
|
||||||
|
|
||||||
static var parentTransaction: Void?
|
static var parentTransaction: Void?
|
||||||
|
static var isSavingSynchronously: Void?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -191,14 +191,14 @@ public /*abstract*/ class BaseDataTransaction {
|
|||||||
/**
|
/**
|
||||||
Refreshes all registered objects `NSManagedObject`s in the transaction.
|
Refreshes all registered objects `NSManagedObject`s in the transaction.
|
||||||
*/
|
*/
|
||||||
public func refreshAllObjectsAsFaults() {
|
public func refreshAndMergeAllObjects() {
|
||||||
|
|
||||||
CoreStore.assert(
|
CoreStore.assert(
|
||||||
self.isRunningInAllowedQueue(),
|
self.isRunningInAllowedQueue(),
|
||||||
"Attempted to refresh entities outside their designated queue."
|
"Attempted to refresh entities outside their designated queue."
|
||||||
)
|
)
|
||||||
|
|
||||||
self.context.refreshAllObjectsAsFaults()
|
self.context.refreshAndMergeAllObjects()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -66,9 +66,9 @@ public extension CoreStore {
|
|||||||
/**
|
/**
|
||||||
Refreshes all registered objects `NSManagedObject`s in the `defaultStack`.
|
Refreshes all registered objects `NSManagedObject`s in the `defaultStack`.
|
||||||
*/
|
*/
|
||||||
public static func refreshAllObjectsAsFaults() {
|
public static func refreshAndMergeAllObjects() {
|
||||||
|
|
||||||
self.defaultStack.refreshAllObjectsAsFaults()
|
self.defaultStack.refreshAndMergeAllObjects()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -83,14 +83,14 @@ public extension DataStack {
|
|||||||
/**
|
/**
|
||||||
Refreshes all registered objects `NSManagedObject`s in the `DataStack`.
|
Refreshes all registered objects `NSManagedObject`s in the `DataStack`.
|
||||||
*/
|
*/
|
||||||
public func refreshAllObjectsAsFaults() {
|
public func refreshAndMergeAllObjects() {
|
||||||
|
|
||||||
CoreStore.assert(
|
CoreStore.assert(
|
||||||
NSThread.isMainThread(),
|
NSThread.isMainThread(),
|
||||||
"Attempted to refresh entities outside their designated queue."
|
"Attempted to refresh entities outside their designated queue."
|
||||||
)
|
)
|
||||||
|
|
||||||
self.mainContext.refreshAllObjectsAsFaults()
|
self.mainContext.refreshAndMergeAllObjects()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user