Deprecated rollback() on async and sync transactions. Added undo utilities to unsafe transactions.

This commit is contained in:
John Rommel Estropia
2015-11-14 20:00:40 +09:00
parent 05b4a7092a
commit 0c0a2a382c
5 changed files with 44 additions and 23 deletions

View File

@@ -15,7 +15,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>FMWK</string> <string>FMWK</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.3.3</string> <string>1.3.4</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>

View File

@@ -190,16 +190,21 @@ public final class AsynchronousDataTransaction: BaseDataTransaction {
} }
/** /**
Rolls back the transaction by resetting the `NSManagedObjectContext`. After calling this method, all `NSManagedObjects` fetched within the transaction will become invalid. This method should not be used after the `commit()` method was already called once. Rolls back the transaction by resetting the `NSManagedObjectContext`. After calling this method, all `NSManagedObjects` fetched within the transaction will become invalid. This method should not be used after the `commit()` method was already called once.
*/ */
public override func rollback() { @available(*, deprecated=1.3.4, message="Resetting the context is inherently unsafe. This method will be removed in the near future. Use `beginUnsafe()` to create transactions with `undo` support.")
public func rollback() {
CoreStore.assert( CoreStore.assert(
!self.isCommitted, !self.isCommitted,
"Attempted to rollback an already committed \(typeName(self))." "Attempted to rollback an already committed \(typeName(self))."
) )
CoreStore.assert(
self.transactionQueue.isCurrentExecutionContext(),
"Attempted to rollback a \(typeName(self)) outside its designated queue."
)
super.rollback() self.context.reset()
} }
@@ -210,6 +215,7 @@ public final class AsynchronousDataTransaction: BaseDataTransaction {
self.closure = closure self.closure = closure
super.init(mainContext: mainContext, queue: queue) super.init(mainContext: mainContext, queue: queue)
self.context.undoManager = nil
} }
internal func perform() { internal func perform() {

View File

@@ -186,21 +186,6 @@ public /*abstract*/ class BaseDataTransaction {
objects.forEach { context.fetchExisting($0)?.deleteFromContext() } objects.forEach { context.fetchExisting($0)?.deleteFromContext() }
} }
// MARK: Saving changes
/**
Rolls back the transaction by resetting the `NSManagedObjectContext`. After calling this method, all `NSManagedObjects` fetched within the transaction will become invalid.
*/
public func rollback() {
CoreStore.assert(
self.bypassesQueueing || self.transactionQueue.isCurrentExecutionContext(),
"Attempted to rollback a \(typeName(self)) outside its designated queue."
)
self.context.reset()
}
// MARK: Internal // MARK: Internal

View File

@@ -181,15 +181,20 @@ public final class SynchronousDataTransaction: BaseDataTransaction {
/** /**
Rolls back the transaction by resetting the `NSManagedObjectContext`. After calling this method, all `NSManagedObjects` fetched within the transaction will become invalid. This method should not be used after the `commit()` method was already called once. Rolls back the transaction by resetting the `NSManagedObjectContext`. After calling this method, all `NSManagedObjects` fetched within the transaction will become invalid. This method should not be used after the `commit()` method was already called once.
*/ */
public override func rollback() { @available(*, deprecated=1.3.4, message="Resetting the context is inherently unsafe. This method will be removed in the near future. Use `beginUnsafe()` to create transactions with `undo` support.")
public func rollback() {
CoreStore.assert( CoreStore.assert(
!self.isCommitted, !self.isCommitted,
"Attempted to rollback an already committed \(typeName(self))." "Attempted to rollback an already committed \(typeName(self))."
) )
CoreStore.assert(
self.transactionQueue.isCurrentExecutionContext(),
"Attempted to rollback a \(typeName(self)) outside its designated queue."
)
super.rollback() self.context.reset()
} }
@@ -217,6 +222,7 @@ public final class SynchronousDataTransaction: BaseDataTransaction {
self.closure = closure self.closure = closure
super.init(mainContext: mainContext, queue: queue) super.init(mainContext: mainContext, queue: queue)
self.context.undoManager = nil
} }

View File

@@ -55,6 +55,30 @@ public final class UnsafeDataTransaction: BaseDataTransaction {
} }
} }
/**
Rolls back the transaction.
*/
public func rollback() {
self.context.rollback()
}
/**
Undo's the last change made to the transaction.
*/
public func undo() {
self.context.undo()
}
/**
Redo's the last undone change to the transaction.
*/
public func redo() {
self.context.redo()
}
/** /**
Begins a child transaction where `NSManagedObject` creates, updates, and deletes can be made. This is useful for making temporary changes, such as partially filled forms. Begins a child transaction where `NSManagedObject` creates, updates, and deletes can be made. This is useful for making temporary changes, such as partially filled forms.