iOS

MVVM(5) - Coordinator

스엠 2023. 1. 5. 22:04

이번글은 Coordinator Pattern에 대한 마지막 글입니다. 

앞선 글들에서 Coordinator Pattern으로 화면을 전환하는 법 그리고 Child Coordinator를 삭제하는 법에 대해서

알아보았습니다. 

이번에는 Child Coordinator를 삭제하는 법에서 조금 더 수정된 형태를 소개해드려 볼까 합니다. 

 

4. childCoordinator를 삭제 하는 법 (2)

navigation pop 혹은 dismiss 이벤트를 캐치하기 위해서 UINavigationControllerDelegate와 UIViewControllerTransitionDelegate를 사용하는 것 까지 해봤는데 여기서 2%쯤 부족하다고 생각되는 부분이 있습니다. 

바로 다음과 같은 상황입니다. 

 

다음과 같이 하나의 Coordinator에 3개의 종속된 ViewController들이 있고,

현재 앱의 NavigationStack에는 [ViewA,ViewB,ViewC],[ViewB,ViewA,ViewC], [ViewC,ViewB,ViewA] 이런식으로 

Coordinator의 rootViewController가 되는 화면이 정해지지 않고 무작위라고 가정해봅시다. 

 

이렇게 되면 Coordinator에는 다음과 같은 구현이 되어야합니다.

딱봐도 어떤 문제가 생길지 감이 오실겁니다. 

바로 NavigationStack에 아직 View들이 남아있는 상태인데도 불구하고 Coordinator가 메모리 릴리즈되는 상황이 발생합니다. 

이렇게 되면 Coordinator가 없어졌으니 NavigationStack에 남아있는 ViewController들은 다른 화면으로 이동하거나 하는 행동을

못하게 됩니다. 

 

따라서 이것을 방지해주기 위하여 변수를 살짝 추가해줄까 합니다.

바로 Coordinator에 종속된 뷰들을 들고 있을 Array입니다. 

그리고 앞으로 ViewController를 present하거나 push할때마다 Array에 넣어줍니다.

그리고 viewControllerPopped(), viewControllerDismissed() 함수도 다음과 같이 바꿔주도록 하겠습니다. 

 

이렇게 하면 일일이 isKind(of :) 함수를 쓸 필요도 없어졌습니다. 그리고 childCoordinator를 삭제하라는 함수도 

viewControllers : [UIViewController]의 갯수가 0일때만 시행되니 도중에 Coordinator가 해제되는 일도 없습니다. 

 

5. RootCoordinator 혹은 특정 Coordinator로 되돌아가는 법 

마지막입니다. 

마지막은 바로 로그아웃,회원탈퇴 등과 같이 앱의 시작화면 혹은 특정 Coordinator로 돌아가야 하는 경우에 대해서 입니다. 

상황을 다음과 같이 가정해봅시다. 

현재 화면 및 Coordinator의 구조는 다음과 같습니다. 

여기서  ViewD에서 ViewC로 가고 싶을때 Coordinator3,Coordinator2를 삭제하고 MainCoordinator의 ChildCoordinator에 Coordinator2_2를 넣어주고 ViewC보여줘야 하는 상황입니다. 

 

저는 이러한 상황을 구현하기 위하여 Coordinator는 Tree 형태를 갖추고 있다는 것에 주목했습니다. 

그러면 BFS 알고리즘을 가지고 MainCoordinator를 통하여 현재까지 쌓아진 어떠한 Coordinator에도 접근이 가능하게 됩니다. 

이렇게 특정 Coordinator를 찾게 되면 이하 Coordinator들은 싹다 삭제를 시키며 NavigationStack 또한 특정 Coordinator의 viewControllers 변수에 저장되어 있는 맨 뒷부분 혹은 특정 ViewController까지 pop을 시킵니다. 

이제 그러면 Coordinator와 NavigationStack이 삭제된 상태죠. 그러면 보여줄 새로운 Coordinator를 생성해주고 childCoordinator에 append 해주시면 해결됩니다. 

 

다시 한번 정리하면 순서는 다음과 같습니다. 

1. BFS알고리즘을 이용하여 원하는 Coordinator(x라 칭합시다)를 찾음

2. x이하의 Coordinator와 ViewController들을 모두 stack에서 정리

3. x에서 원하는 Coordinator와 ViewController를 보여줌

 

코드는 다음과 같습니다.

어떻게 작동되는지 동영상도 첨부합니다.

 

 

로그를 보시면 Coordinator2,Coordinator3,ViewD전부 안전하게 메모리 릴리즈가 되는 것을 확인할 수 있습니다. 

 

 

여기까지가 제가 Coordinator Pattern을 공부하며 나름 제 방식대로

Tuning을 하고 정립한 구조입니다. 

물론 이것말고 Router를 사용하는 방법도 있고, closure, KVO 등등 여러가지 방법이 있습니다. 

 

따라서 제 방법이 괜찮다고 생각되시는 분들은 제 방법을 수정하든 추가하든 도입하시면되고, 아! 이건 아닌거 같다라고 하시면 

언제든지 댓글에 태클 걸어주시면 굉장히 감사하겠습니다. 

 

 

'iOS' 카테고리의 다른 글

TUIST(1) - 설치,실행,기본구조  (0) 2023.02.12
MVVM(6) - ViewModel  (0) 2023.01.13
MVVM(4) - Coordinator  (0) 2022.12.27
MVVM(3) - Coordinator  (0) 2022.12.23
MVVM (2)  (0) 2022.12.19