CoreData 활용(Undo Manager)

문인범·2024년 3월 17일

Swift

목록 보기
9/9

그냥 대충 정리한거라 내용이 빈약합니다. 😢
이글 보시면 그냥 무시하고 지나가시길...

undoManager | Apple Developer Documentation
Mastering In CoreData (Part 17 Multithreading Concurrency Strategy Context UndoManager)

CoreData의 핵심기능 중 하나인 되돌리기 기능을 사용해보겠습니다.

UndoManager

NSManagedObjectContext의 프로퍼티로 있는 클래스다.
기본적으로는 nil로 할당되어 있으며 필요할 때 만들어 쓰면 된다.
이 친구는 변화를 추적하여 undo, redo 기능을 지원한다.

아니면 UndoManager 단독으로도 사용이 가능하다. ( 다양하게 추적이 가능함 )

기본 사용법


출처 : Mastering In CoreData (Part 17 Multithreading Concurrency Strategy Context UndoManager)

1. UndoManager 생성

기본적으로 NSManagedObjectContext에서 UndoManager는 nil 이기 때문에 따로 만들어주어야 한다.

managedObjectContext.undoManager = UndoManager()

2. Undo Group 생성

beginUndoGrouping 메소드를 사용해 변화 추적을 시작한다.

managedObjectContext.undoManager?.beginUndoGrouping()

3. 값 변화 시키기

데이터를 추가하거나 삭제하여 변화 시킨다.

이 예제에선 User 두 명을 추가시켰다.

let user1 = User(context: managedObjectContext)
user1.name = "user1"

let user2 = User(context: managedObjectContext)
user2.name = "user2"

4. Undo Group 종료

추적을 할 변화상황이 끝났으면 endUndoGrouping() 을 사용하여 추적을 중지한다.

중지를 해야지 undo, redo를 할 수 있다.

managedObjectContext.undoManager?.endUndoGrouping()

5. Undo 또는 Redo를 한다.

managedObjectContext.undoManager?.undo()
// managedObjectContext가 비어있어진다.

managedObjectContext.undoManager?.redo()
// 다시 돌아와 user1, user2가 생긴다.

커스텀하여 사용하기

[Swift] UndoManager에 대하여

찾아보니까 얘 단독으로도 사용할 수 있다. 내가 쓴 방식이 거의 단독사용인듯하다.
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()를 사용하면 위에 등록해놓은 메소드가 실행되어 삭제된 데이터가 복구된다.
위 블로그에서 말한대로 필기앱 등에 사용하면 좋을듯 하다.

전체코드는 여기에
https://github.com/mooninbeom/CoreDataStudy

profile
월클 개발자를 향한 도전일지

0개의 댓글