diff --git a/CoreStore/Fetching and Querying/BaseDataTransaction+Querying.swift b/CoreStore/Fetching and Querying/BaseDataTransaction+Querying.swift index 44496d9..fd63d9d 100644 --- a/CoreStore/Fetching and Querying/BaseDataTransaction+Querying.swift +++ b/CoreStore/Fetching and Querying/BaseDataTransaction+Querying.swift @@ -106,7 +106,7 @@ public extension BaseDataTransaction { public func fetchOne(from: From, _ fetchClauses: FetchClause...) -> T? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to fetch from a \(typeName(self)) outside its designated queue." ) @@ -124,7 +124,7 @@ public extension BaseDataTransaction { public func fetchOne(from: From, _ fetchClauses: [FetchClause]) -> T? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to fetch from a \(typeName(self)) outside its designated queue." ) @@ -142,7 +142,7 @@ public extension BaseDataTransaction { public func fetchAll(from: From, _ fetchClauses: FetchClause...) -> [T]? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to fetch from a \(typeName(self)) outside its designated queue." ) @@ -160,7 +160,7 @@ public extension BaseDataTransaction { public func fetchAll(from: From, _ fetchClauses: [FetchClause]) -> [T]? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to fetch from a \(typeName(self)) outside its designated queue." ) @@ -178,7 +178,7 @@ public extension BaseDataTransaction { public func fetchCount(from: From, _ fetchClauses: FetchClause...) -> Int? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to fetch from a \(typeName(self)) outside its designated queue." ) @@ -196,7 +196,7 @@ public extension BaseDataTransaction { public func fetchCount(from: From, _ fetchClauses: [FetchClause]) -> Int? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to fetch from a \(typeName(self)) outside its designated queue." ) @@ -214,7 +214,7 @@ public extension BaseDataTransaction { public func fetchObjectID(from: From, _ fetchClauses: FetchClause...) -> NSManagedObjectID? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to fetch from a \(typeName(self)) outside its designated queue." ) @@ -232,7 +232,7 @@ public extension BaseDataTransaction { public func fetchObjectID(from: From, _ fetchClauses: [FetchClause]) -> NSManagedObjectID? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to fetch from a \(typeName(self)) outside its designated queue." ) @@ -250,7 +250,7 @@ public extension BaseDataTransaction { public func fetchObjectIDs(from: From, _ fetchClauses: FetchClause...) -> [NSManagedObjectID]? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to fetch from a \(typeName(self)) outside its designated queue." ) @@ -268,7 +268,7 @@ public extension BaseDataTransaction { public func fetchObjectIDs(from: From, _ fetchClauses: [FetchClause]) -> [NSManagedObjectID]? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to fetch from a \(typeName(self)) outside its designated queue." ) @@ -285,7 +285,7 @@ public extension BaseDataTransaction { public func deleteAll(from: From, _ deleteClauses: DeleteClause...) -> Int? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to delete from a \(typeName(self)) outside its designated queue." ) @@ -302,7 +302,7 @@ public extension BaseDataTransaction { public func deleteAll(from: From, _ deleteClauses: [DeleteClause]) -> Int? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to delete from a \(typeName(self)) outside its designated queue." ) @@ -323,7 +323,7 @@ public extension BaseDataTransaction { public func queryValue(from: From, _ selectClause: Select, _ queryClauses: QueryClause...) -> U? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to query from a \(typeName(self)) outside its designated queue." ) @@ -344,7 +344,7 @@ public extension BaseDataTransaction { public func queryValue(from: From, _ selectClause: Select, _ queryClauses: [QueryClause]) -> U? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to query from a \(typeName(self)) outside its designated queue." ) @@ -365,7 +365,7 @@ public extension BaseDataTransaction { public func queryAttributes(from: From, _ selectClause: Select, _ queryClauses: QueryClause...) -> [[NSString: AnyObject]]? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to query from a \(typeName(self)) outside its designated queue." ) @@ -386,7 +386,7 @@ public extension BaseDataTransaction { public func queryAttributes(from: From, _ selectClause: Select, _ queryClauses: [QueryClause]) -> [[NSString: AnyObject]]? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to query from a \(typeName(self)) outside its designated queue." ) diff --git a/CoreStore/Importing Data/BaseDataTransaction+Importing.swift b/CoreStore/Importing Data/BaseDataTransaction+Importing.swift index 816eabb..3498e80 100644 --- a/CoreStore/Importing Data/BaseDataTransaction+Importing.swift +++ b/CoreStore/Importing Data/BaseDataTransaction+Importing.swift @@ -45,7 +45,7 @@ public extension BaseDataTransaction { source: T.ImportSource) throws -> T? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to import an object of type \(typeName(into.entityClass)) outside the transaction's designated queue." ) @@ -74,7 +74,7 @@ public extension BaseDataTransaction { sourceArray: S) throws -> [T] { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to import an object of type \(typeName(into.entityClass)) outside the transaction's designated queue." ) @@ -109,7 +109,7 @@ public extension BaseDataTransaction { source: T.ImportSource) throws -> T? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to import an object of type \(typeName(into.entityClass)) outside the transaction's designated queue." ) @@ -160,7 +160,7 @@ public extension BaseDataTransaction { @noescape preProcess: (mapping: [T.UniqueIDType: T.ImportSource]) throws -> [T.UniqueIDType: T.ImportSource] = { $0 }) throws -> [T] { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to import an object of type \(typeName(into.entityClass)) outside the transaction's designated queue." ) diff --git a/CoreStore/Internal/NSManagedObjectContext+Transaction.swift b/CoreStore/Internal/NSManagedObjectContext+Transaction.swift index cd0f03a..d9960cd 100644 --- a/CoreStore/Internal/NSManagedObjectContext+Transaction.swift +++ b/CoreStore/Internal/NSManagedObjectContext+Transaction.swift @@ -55,6 +55,15 @@ internal extension NSManagedObjectContext { } } + internal func isRunningInAllowedQueue() -> Bool { + + guard let parentTransaction = self.parentTransaction else { + + return false + } + return parentTransaction.isRunningInAllowedQueue() + } + internal func temporaryContextInTransactionWithConcurrencyType(concurrencyType: NSManagedObjectContextConcurrencyType) -> NSManagedObjectContext { let context = NSManagedObjectContext(concurrencyType: concurrencyType) diff --git a/CoreStore/Saving and Processing/BaseDataTransaction.swift b/CoreStore/Saving and Processing/BaseDataTransaction.swift index df4bcb7..e43c09c 100644 --- a/CoreStore/Saving and Processing/BaseDataTransaction.swift +++ b/CoreStore/Saving and Processing/BaseDataTransaction.swift @@ -56,7 +56,7 @@ public /*abstract*/ class BaseDataTransaction { public func create(into: Into) -> T { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to create an entity of type \(typeName(T)) outside its designated queue." ) @@ -110,7 +110,7 @@ public /*abstract*/ class BaseDataTransaction { public func edit(object: T?) -> T? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to update an entity of type \(typeName(object)) outside its designated queue." ) guard let object = object else { @@ -131,7 +131,7 @@ public /*abstract*/ class BaseDataTransaction { public func edit(into: Into, _ objectID: NSManagedObjectID) -> T? { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to update an entity of type \(typeName(T)) outside its designated queue." ) CoreStore.assert( @@ -150,7 +150,7 @@ public /*abstract*/ class BaseDataTransaction { public func delete(object: NSManagedObject?) { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to delete an entity outside its designated queue." ) guard let object = object else { @@ -180,7 +180,7 @@ public /*abstract*/ class BaseDataTransaction { public func delete(objects: S) { CoreStore.assert( - self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(), + self.isRunningInAllowedQueue(), "Attempted to delete entities outside their designated queue." ) @@ -223,4 +223,9 @@ public /*abstract*/ class BaseDataTransaction { context.undoManager = NSUndoManager() } } + + internal func isRunningInAllowedQueue() -> Bool { + + return self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext() + } }