❓ AppDelegate와 SceneDelegate(2)
지난 글에서는 AppDelegate에 대해 알아봤습니다!
오늘은 SceneDelegate가 왜 생겼고 어떤 역할을 하는지 알아볼게요🙂
🧐 SceneDelegate는 왜 생겨났을까요?
그 이유는 생각보다 간단합니다
iOS13부터 애플이 아이패드에 Multi Window를 지원하기 시작했기 때문입니다
아래 이미지처럼 두 가지 화면이 UIScreen위에 그려지고 있는데, 이전 같은 방식이라면 두 화면을 모두 한 번에 관리할 수는 없습니다
그리고 애플도 이를 당연히 인지하고 있었겠죠!
그래서 이 두 화면을 모두 관리해주어야 하는 관리자로, SceneDelegate를 만들어낸 것입니다
❓ SceneDelegate
SceneDelegate가 왜 생겨났는지 알게 됐다면 이제 좀 더 파볼까요?
SceneDelegate는 위 이미지처럼 앱의 Active, InActive 상태를 주체하는 역할을 AppDelegate로부터 넘겨받았습니다
쉽게 말하자면, 사용자의 스크린에 어떤 화면을 보여줄지 관리하는 주체가 SceneDelegate로 교체되었단 거죠!
이러한 과정을 통해 LifeCycle도 아래처럼 변하게 되었습니다
(이전과 비교했을 때, NotRunning이 사라졌어요!)
그리고 각 상태에 돌입하기 전 메서드들을 간단히 살펴보면 다음과 같습니다
sceneDidDisconnect(_:)
이름에서도 알 수 있듯이 scene이 discard 된 직후 또는 background에 진입한 경우 호출됩니다
그리고 scene과 관련된 모든 리소스가 해제됩니다
scene(_: willConnectTo: options: )
UISceneSession LifeCycle에서 가장 호출되는 메서드로 여기에 첫 화면으로 보여주고 싶은 화면을 넣어줄 수 있습니다
과거에 disconnected 된 UI를 되돌릴 때에도 사용됩니다
sceneWillEnterForeground(_ :)
앱의 Scene이 Foreground로 전환될 때
즉, 앱이 처음 Active 상태가 되기 직전 또는 Scene이 Background에서 Foreground로 넘어오기 직전에 실행됩니다
여기서는 필요한 자원이나 데이터들을 네트워크로부터 불러오는 작업들을 실행시켜야 합니다
sceneDidBecomeActive(_:)
Active 상태로 바뀐 후에 호출됩니다
만약 데이터가 앱 외부에서도 자주 변경된다면, 이는 background task를 이용해 네트워킹하는 것이 바람직합니다
자주 변경되지 않는다면, 비동기적으로 데이터의 변경사항을 불러올 수 있습니다!
- 현재 보이는 뷰컨트롤러 변경
- 뷰와 컨트롤의 상태와 데이터 업데이트
- dispatch queue 재개
- 데이터 소스 객체 업데이트
sceneWillResignActive(_ :)
앱이 Active 상태에서 InActive 상태로 전환될 때 호출되는 메서드입니다
앱을 사용하던 중 전화가 와서 잠시 앱을 사용할 수 없을 때 사용된다고 생각하시면 됩니다
이럴 때에 아래와 같은 수행들을 해주면 좋습니다
- 사용자 데이터 저장
- dispatch queue 실행 연기
- 새 작업 스케줄 중단 등
sceneDidEnterBackground(_ :)
Scene이 Foreground에서 Background로 전환될 때 호출됩니다
이후에 다시 Foreground로 전환될 때 복원할 수 있도록 state 정보를 저장하거나 데이터를 저장 또는 공유 자원을 돌려주는 등의 작업을 진행할 수 있습니다
- 카메라 및 다른 하드웨어 자원 접근 해제
- 이미지 또는 미디어 폐기
- 공유 시스템 데이터베이스와의 연결 해제 등
sceneDidDisconnect(_ :)
Scene이 Background로 전환되었을 때, 시스템이 자원을 확보하기 위해 disconnect 할 수 있습니다
*disconnect : Session에서 해당 Scene의 연결이 끊김
이 메서드에서는 디스크 또는 네트워크로부터 불러올 수 있고 생성이 쉬운 데이터들은 돌려주고 사용자의 input처럼 재생성이 어려운 데이터는 가지고 있게 하는 작업을 수행해주어야 합니다
마무리
이처럼 iOS13에서 첫 등장한 SceneDelegate는 앱의 UI 상태에 따른 다양한 메서드들을 가지고 있습니다!
이러한 점에서 확연히 AppDeleagate와 다른 역할을 하는 점을 알 수 있죠 🙂
생각했던 것보다도 Scene이라는 개념과 SceneDelegate 내 메서드를 살펴보는 게 조금 어려웠던 것 같지만 추후에 SceneDelegate를 활용할 일이 있을 때 보다 전략적으로 사용할 수 있을 것 같습니다
혹시 수정할 사항이 있다면 편하게 말씀해 주세요!🙏
✏️ 오늘의 요약
- SceneDelegate
- iOS13에서 등장
- 아이패드에 Multi Window를 지원하게 되며 각 Scene을 관리하기 위해 탄생
- 화면에 올려져 있는 각 Scene의 UI Lifecycle을 관리하는 주체
- iOS13에서 등장
📚 참고
https://medium.com/@LeeZion94/app-life-cycle-66996a16d94b
https://sueaty.tistory.com/134
https://velog.io/@lhj26/iOS-Scene-Delegate-vs-App-Delegate