AppDelegate
Appdelegate.swift에서 발견할 수 있는 AppDelegate 클래스는 아래와 같이 정의되어 있다.
@main
class AppDelegate: UIResponder, UIApplicationDelegate
설명
Your app delegate object manages your app’s shared behaviors. The app delegate is effectively the root object of your app, and it works in conjunction with UIApplication to manage some interactions with the system.
먼저 app delegate라는 용어를 하나 알아야 한다. app delegate는 AppDelegate 클래스의 인스턴스를 말하며, 현재 앱의 상태에 따라 컨텐츠를 표시해줄 UIWindow를 만들어준다. 위의 설명을 보면 app delegate가 우리 앱의 전반적으로 공유되는 behaviors를 관리하는데, app delegate는 app의 root에 위치하고 있으며 UIApplication과 협력하여 일한다고 한다. UIApplication은 다른 글에서 다루겠다.
어쨌거나, 우리가 프로젝트를 생성하면 볼 수 있는 파일인 AppDelegate.swift는 @UIApplicationMain 속성을 통해서 entry point를 만들어 준다. 또한 앱의 입력 이벤트를 전달하는 run loop를 형성한다.
AppDelegate 클래스의 이름을 delegate에 전달하면, 시스템은 응용프로그램 객체(application object)를 생성한다. 이 객체는 app life cycle을 담당해준다.
시스템이 AppDelegate 클래스의 인스턴스를 생성하면, 이를 application object에 할당한다. 이후, 시스템이 app을 실행한다.
그래서 app delegate의 역할을 정리하면 다음과 같다.
- app의 central 자료 구조를 초기화한다.
- app의 scene을 조작한다.
- app의 밖에서 전달되는 notification에 응답한다. 예를 들어 저전력 상태, 다운로드 완료 completion과 같은 것들에 응답한다.
- 앱의 특정 장면, 뷰, 뷰컨트롤러에 특정적인 것이 아니라 앱 그 자체를 타게팅한 이벤트에 응답한다.
- launch time에 필요한 서비스들을 등록하는데, 이러한 것들로 APNs와 같은 것들이 있다.
UIApplicationDelegate 프로토콜
@MainActor protocol UIApplicationDelegate
이 프로토콜은 앱을 세팅하고, 앱 상태 변화에 응답하며 다른 app-level 이벤트를 처리하는 데 사용하는 여러가지 방법을 정의한다. 메서드의 내부에 방법을 구현하면 그대로 적용된다.
이러한 메서드를 이용하여 앱 상태 전환 간(앱 실행, 백그라운드 상태 관리)의 신호를 받아서 delegate 메서드를 호출하여 앱이 응답할 수 있도록 할 수 있다. 예를 들어 timer를 실행해 놓고, 앱을 백그라운드로 전환하면 timer의 count를 증가시켜 놓는 기능을 위의 메서드를 통해 구현할 수 있다.
그렇다면 @mainactor는 무엇일까? 개발자 문서
우선 Actor는 스레드의 모델을 뜻한다고 한다. 한 번에 하나의 작업만 변경하도록 하여 경쟁 상태를 피하도록 해준다. 그리고 MainActor는 메인 스레드를 대변한다고 한다. main actor는 메인 dispatch queue에서 모든 동기화를 하고, 이를 클래스나 프로토콜 앞에 붙여주면, 그 모든 프로퍼티와 메서드가 main에서 동작할 수 있다.
GlobalActor라는 개념도 있는데, Main과 Global이라는 네이밍으로 인해 반대 개념이라 생각할 수 있지만 MainActor는 GlobalActor에 포함된다.
Actor 관련 내용은 따로 다루어야 할 것 같아 추후에 더 공부해보려고 한다.
window 객체
var window: UIWindow?
AppDelegate는 위와 같은 window 객체를 가지고 있는데, 현재 앱의 창에 대한 참조를 저장한다. window는 옵셔널이기 때문에 nil이 될 수 있고, 그렇게 되면 화면에 아무것도 보이지 않는다.
UIWindow 클래스는 UIView의 서브클래스이며, 이 창을 root로 하여 view hierachy를 쌓아 나간다.
app life cycle 톺아보기
이제는 익숙한 그림이지만, 지금에서야 조금씩 진짜 의미가 와닿기 시작하는 것 같다.
위에서 설명했듯이 Application Delegate는 Application Object와 상호작용하며 App의 이벤트를 처리한다. 또한 View에 이러한 외부 입력과 Event들을 뷰컨트롤러와 UIWindow에 전달하고, UI 업데이트가 진행될 수 있도록 한다.
느낀점
AppDelegate 하나를 공부하는 데에도 모르는 개념이 너무 많았다. 하나씩 더 공부해가자. 우선 UIApplication도 봐야하고, Actor도 봐야 한다. Actor는 동시성 문제 처리를 위해 새로 도입된 개념이라고 하는데, WWDC에서 어떤 내용들이 업데이트 되어 왔는지 정리해보는 것도 좋아 보인다.
그리고 UIApplicationDelegate에 존재하는 메서드들도 하나씩 파헤쳐보자. 사실 AppDelegate를 갑자기 공부하게 된 것은 APNs를 구현하려고 하다가 AppDelegate 관련 내용이 많이 나와서 시작한 것인데, 아직 공부할 내용이 많다고 느껴진다. 기능 구현도 구현이지만, 최소 코드를 직접 짜지는 못하더라도 이해를 할 수 있는 수준으로 공부를 해 나가자~!