그냥 대충 정리한거라 내용이 빈약합니다. 😢
이글 보시면 그냥 무시하고 지나가시길...
undoManager | Apple Developer Documentation
Mastering In CoreData (Part 17 Multithreading Concurrency Strategy Context UndoManager)
CoreData의 핵심기능 중 하나인 되돌리기 기능을 사용해보겠습니다.
NSManagedObjectContext의 프로퍼티로 있는 클래스다.
기본적으로는 nil로 할당되어 있으며 필요할 때 만들어 쓰면 된다.
이 친구는 변화를 추적하여 undo, redo 기능을 지원한다.
아니면 UndoManager 단독으로도 사용이 가능하다. ( 다양하게 추적이 가능함 )

출처 : Mastering In CoreData (Part 17 Multithreading Concurrency Strategy Context UndoManager)
기본적으로 NSManagedObjectContext에서 UndoManager는 nil 이기 때문에 따로 만들어주어야 한다.
managedObjectContext.undoManager = UndoManager()
beginUndoGrouping 메소드를 사용해 변화 추적을 시작한다.
managedObjectContext.undoManager?.beginUndoGrouping()
데이터를 추가하거나 삭제하여 변화 시킨다.
이 예제에선 User 두 명을 추가시켰다.
let user1 = User(context: managedObjectContext)
user1.name = "user1"
let user2 = User(context: managedObjectContext)
user2.name = "user2"
추적을 할 변화상황이 끝났으면 endUndoGrouping() 을 사용하여 추적을 중지한다.
중지를 해야지 undo, redo를 할 수 있다.
managedObjectContext.undoManager?.endUndoGrouping()
managedObjectContext.undoManager?.undo()
// managedObjectContext가 비어있어진다.
managedObjectContext.undoManager?.redo()
// 다시 돌아와 user1, user2가 생긴다.
찾아보니까 얘 단독으로도 사용할 수 있다. 내가 쓴 방식이 거의 단독사용인듯하다.
registerUndo 메소드를 사용하여 직접 undo 로직을 구성하여 undo, redo를 진행할 수 있다.
내가 사용한 방법은 이러하다.
// 데이터를 삭제할 경우 삭제된 데이터를 추가하는 클로저를 undoManager에 등록해놓는다.
// 되돌릴 시 삭제된 데이터가 다시 복구된다.
undoManager.registerUndo(withTarget: managedObjectContext) { context in
if context.deletedObjects.count != 0 {
let changedValue = context.deletedObjects
if changedValue.count == 1 {
context.insert(changedValue.first!)
} else {
for movie in changedValue {
context.insert(movie)
}
}
}
}
삭제 메소드를 실행할 시에 deletedObject를 가져와 context에 insert 하는 로직을 UndoManager에 등록해놓는다.
그러면 undo()를 사용하면 위에 등록해놓은 메소드가 실행되어 삭제된 데이터가 복구된다.
위 블로그에서 말한대로 필기앱 등에 사용하면 좋을듯 하다.