About the UI Restoration Process

https://developer.apple.com/documentation/uikit/view_controllers/preserving_your_app_s_ui_across_launches/about_the_ui_restoration_process

"Learn how to customize the UIKit state restoration process."

UIKit 상태 복원 과정을 커스터마이징 하는 방법에 대해 알아봅니다.

Overview

Figure 1은 앱이 복구되기까지 앱 launch 시점으로부터 발생하는 호출의 연속을 보여줍니다. 복원은 앱의 초기화 중간 시점 동안 발생하며, 상태 복원 아카이브가 사용 가능하고 앱 딜리게이트의 application(_:shouldRestoreApplicationState:) 메소드가 true를 반환할 때에만 진행됩니다.

Figure 1 The interface restoration sequence

복원 과정의 첫 번째 단계는 인터페이스를 위한 뷰 컨트롤러 객체(명시적이거나 암묵적이거나 상관없이)를 생성하는 것입니다. 두 번째 단계는 이 객체들의 상태를 디코딩하고 복원하는 것입니다. 두 단계 모두 뷰 컨트롤러 계층구조 재생성에 있어 필요합니다.예를 들어 네비게이션 컨트롤러와 네비게이션 컨트롤러의 자식 뷰 컨트롤러 생성 이후 해당 객체들 사이의 즉각적인 연결은 없습니다. 실제로는 네비게이션 컨트롤러 및 네비게이션 컨트롤러의 자식 뷰 컨트롤러 사이의 관계를 재구성해주는 네비게이션 컨트롤러의 decodeRestorableState(with:) 메소드입니다.

상태 복원이 마무리된 후 UIKit은 앱 딜리게이트의 application(_:didFinishLaunchingWithOptions:) 메소드를 호출합니다. 최근 변경사항 혹은 인터페이스에 추가된 부분을 만들기 위해 이 메소드를 사용하시기 바랍니다. 예를 들어 뷰 컨트롤러 계층구조에 로그인 스크린을 추가할 것입니다.

Recreate Your View Controllers

복원이 진행되는 동안 UIKit은 보존된 인터페이스로부터 뷰 컨트롤러의 생성 혹은 위치시키는 것을 시도합니다. UIKit은 우선 뷰 컨트롤러 객체 제공을 요청합니다. 뷰 컨트롤러를 제공하지 않은 경우 UIKit은 이를 암묵적으로 찾습니다. 아래는 UIKit이 뷰 컨트롤러를 재생성하기 위해 따라가는 단계의 연속을 보여줍니다.

  1. 뷰 컨트롤러의 복원 클래스를 요청합니다. 복원 클래스는 특정 뷰 컨트롤러를 어떻게 생성하는지 알고 있습니다. 해당 클래스를 뷰 컨트롤러의 restorationClass 속성에 할당하는 것을 통해 복원 클래스를 선언할 수 있습니다. 복원 과정이 진행되는 동안 UIKit은 뷰 컨트롤러의 새 인스턴스 요청을 위해 복원 클래스의 viewController(withRestorationIdentifierPath:coder:) 메소드를 호출하며, 이 메소드는 요청한 새 인스턴스를 번환합니다. 만약 nil을 반환하도록 하면, UIKit은 뷰 컨트롤러 생성 시도를 멈추고 복원 과정에서 빠져나옵니다.
  2. 앱 딜리게이트에 요청합니다. 뷰 컨트롤러가 복원 클래스를 갖고 있지 않았다면, UIKit은 앱 딜리게이트의 application(_:viewControllerWithRestorationIdentifierPath:coder:) 메소드를 호출합니다. 해당 메소드에서 nil을 반환하도록 하면, UIKit은 탐색을 계속합니다.
  3. 기존 객체를 확인합니다. UIKit은 정확히 같은 복원 경로를 갖는 이미 생성된 뷰 컨트롤러를 찾습니다.
  4. 스토리보드로부터 뷰 컨트롤러를 인스턴스화합니다. 여전히 뷰 컨트롤러를 갖고 있지 않은 경우 UIKit은 앱의 스토리보드로부터 자동으로 뷰 컨트롤러를 인스턴스화합니다.

상태 복원 시작 전에도 UIKit은 앱의 기본값 뷰 컨트롤러를 스토리보드로부터 로드합니다. UIKit은 이러한 뷰 컨트롤러를 자유롭게 로드할 수 있기 때문에 복원 클래스 혹은 앱 딜리게이트를 사용해서 뷰 컨트롤러를 생성하지 않는 것이 더 낫습니다. 다른 뷰 컨트롤러의 경우 뷰 컨트롤러가 스토리보드에서 정의되지 않은 경우에만 복원 클래스를 할당하시기 바랍니다. 특정 상황에서 뷰 컨트롤러의 생성을 막기 위해 복원 클래스를 할당할 수도 있습니다. 예를 들어 관련 복원 아카이브가 오래된 데이터 혹은 누락된 데이터를 참조하고 있는 경우 뷰 컨트롤러를 표시하는 것을 피하길 원할 것입니다.

코드에서 뷰 컨트롤러를 재생성하는 경우 다른 모든 초기화와 더불어 항상 뷰 컨트롤러의 restorationIdentifier 속성에 값을 재할당해야 합니다. 이러한 값을 생성 시점에 할당하는 것은 뷰 컨트롤러가 다음 주기 동안 보존될 것을 보장해줍니다.

func viewController(withRestorationIdentifierPath 
                    identifierComponents: [Any], 
                    coder: NSCoder) -> UIViewController? {
   let vc = MyViewController()
        
   vc.restorationIdentifier = identifierComponents.last as? String
   vc.restorationClass = MyViewController.self
        
   return vc
}

Note
복원 클래스는 항상 UIKit에 의해 예상되는 클래스를 반환해야 합니다. 복원 아카이브는 각각의 보존된 뷰 컨트롤러의 클래스를 포함합니다. 복원 클래스가 다른 클래스의 인스턴스를 반환하는 경우 UIKit은 해당 뷰 컨트롤러의 decodeRestorableState(with:) 메소드를 반환하지 않습니다.

See Also


Process Details

About the UI Preservation Process

UIKit 상태 보존 프로세스를 커스터마이징 하는 방법에 대해 알아봅니다.

https://developer.apple.com/documentation/uikit/view_controllers/preserving_your_app_s_ui_across_launches/about_the_ui_preservation_process
https://velog.io/@panther222128/About-the-UI-Preservation-Process


좋은 웹페이지 즐겨찾기