[Swift] UndoManager에 대하여

Uno·2021년 9월 24일
0

Tip-Swift

목록 보기
17/26
post-custom-banner

(이미지 출처 : https://unsplash.com/photos/UWFnSfocJbA?utm_source=unsplash&utm_medium=referral&utm_content=creditShareLink)

상태를 Upside down한다고 해서 이 이미지를 추가했...



공부하게된 배경


상황

  • 외주를 작업 중, 그리기 관련 로직을 구현하고 있었습니다. 그리기 관련 기능중에서 RedoUndo 를 필요로 했고, 그것을 구현하면서 자료를 찾았습니다.

문제

  • 그리기 획순을 모두 저장하지 않는다. -> 디바이스별 메모리 고려
  • Redo, Undo 하고 다시 작성했을 때, 이상없이 동작해야한다.

해결

  • 기존에 알던 자료구조를 통해서 구현하고자 했습니다.

1. Queue

  • Queue를 이용하면, 일정한 갯수만큼만 그리기 획을 저장하도록 커스텀하기도 쉽고,구현도 쉽습니다.

2.LinkedList

  • 데이터를 추가하거나 제거할 때, 다른 자료구조에 비해 상대적으로 자유롭죠. 그리고 다음 데이터 이전데이터에 대한 정보도 있기 때문에, redo와 undo 기능에 적합하다고 생각했습니다.

3. Ringbuffer

  • Queue에서 조금 커스텀해서 RingBuffer를 통해 저장될 데이터 갯수를 제한하면 될 것 같았습니다.

자료구조를 통해서 직접 구현하려고 하던 도중에,

공식문서를 찾아보니 이미 관련 기능을 구현한 객체가 있더라구요.

그 객체가 이번 글의 주제인 "UndoManager" 입니다.


Task Manaement


UndoManager는 공식문서에 해당 색션 하위 문서로 등록되어 있습니다.
(즉, UnoManager의 상위 문서가 Task Management)

먼저 정의를 보겠습니다.

Manage your app’s work and its interaction with the user and the system

해석 : 사용자와 시스템 간의 상호작용과 앱의 동작을 관리하는 객체를 의미합니다.

공식문서에서 제공하는 Topics 는 다음과 같습니다.

  • Undo
    - class : UndoManager
  • Progress
    - protocol : PrograssReporting
    - class : Prograss
  • Opertaions
    - class : Operation
    - class : OperationQueue
    - class : BlockOpertaion
  • Scheduling
    - class : Timer
  • Activity Sharing
    - Increasing App Usage with suggestions Based on User Activities
    - Continuing User Activities with Handoff
    - Implementing Handoff in Your App
    - class : NSUserActivity
    - protocol : NSUserActivityDelegate
  • System Interaction
    - class : ProcessInfo
    - class : NSBackgroundActivityScheduler
  • User Notifications
    - protocol : NSUserNotificationCenterDelegate
  • Combine Integration
    - typealias : Published
    - typealias : ObservableObject

내용들을 상세히 본다는 느낌보다는, Task Management에 속한 객체들이 무엇인지 보면, TaskManagement가 어떤 역할을 하는 객체인지 감이 조금은 잡히실 것 같아 적어봤어요.

그 중에서 이번 글의 주제인 UndoManager 에 대해서 좀더 알아보겠습니다.


UndoManager

A general-purpose recorder of operations that enables undo and redo.

undo와 redo를 사용 가능하도록하는 오퍼레이션들의 레코더 객체입니다.
-> 해석하자면, redo와 undo가 가능하도록 기록을 해둠 + redo undo 동작하도록 관리하는 객체

class UndoManager: NSObject

공식문서에 적힌 개요를 보고 내용을 정리했습니다.

Undo 기능을 사용하려면, 등록을 해야겠죠.
그래서 등록하는 메소드가 구현되어 있습니다. 해당 메소드를 사용해서 등록합니다.

객체의 이름을 지정하고, 클로저를 통해서 어떤 동작을 호출할지 결정하면 되는 그런 메소드입니다.
(예제 파일에 주석으로 작성해두겠습니다.)

이렇게 undo에 대해서 등록을 한 이후에 undo() 라는 undo를 동작시키는 메소드가 있습니다.
이 메소드는 undo 동작을 해서 undo를 호출한시점 보다 이전으로 되돌리는 역할을 합니다.

Undo를 호출하게 될 때, UndoManagerredo()를 호출 할 수 있도록 undo 이전 상태를 자동으로 저장합니다.
UndoManager 는 UI 상호작용에 기본적으로 사용하는 객체입니다.

예를 들면, UIKit에서 text view에 작성하거나 했을 때, 사용할 수 있겠죠.

물론 UndoManager 는 일반적인 상태 관리의 역할로도 사용할 수 있습니다.

예를 들면, 커멘드 라인에 가장 마지막 명령 실행을 취소할 수도 있고, 네트워크 라이브러리가 요청했던 것들을 취소하고 다시 다른 요청으로 변경할 수도 있습니다.

요약 : UndoManager == (앱의) 상태를 지배하는 자

사용하는 방법은 상당히 간단합니다.

  1. 등록
  2. 호출
    (물론 Grouping 하는 방법도 있지만, 그건 추후에 다룰 기회가 있으면 다루겠습니다.)

프로젝트 파일은 아래 링크에서 받아가시면 됩니다.

https://github.com/kipsong133/UndoManager_Example/tree/main

profile
iOS & Flutter
post-custom-banner

0개의 댓글