아직 이전 글들을 읽어보지 않으셨다면, 아래 글을 읽어보시는 걸 추천드립니다:)
https://developerpaul.tistory.com/24
https://developerpaul.tistory.com/26
예제는 아래 링크에 있습니다:)
https://github.com/Developer-Paul-t/RxSwift
Developer-Paul-t/RxSwift
Contribute to Developer-Paul-t/RxSwift development by creating an account on GitHub.
github.com
이번 시간에는 지난 시간 FlowContributors에 의해서 넘어온 새로운 Flow와 Stepper를 살펴보고, Scene을 띄우는 걸 해봅시다. 그리고 마지막으로 근본적인 로직이 어떻게 구성되어있는지 Flow Chart로 정리하겠습니다:)
1. 새로운 Flow를 구현해보자.
우리가 새롭게 도착한 Flow는 root를 UINavigationController를 가지고 있습니다. 그렇다는건 앞으로 이 Flow는 navigationBar와 push, pop로 화면 전환을 하게 된다는 의미죠. 나머지는 똑같습니다:) 저는 DetailViewController에 article을 전달하는 방식으로 구현했기 때문에 assciatedValue로 Article을 주었습니다.
navigate에서 실행할 함수는 위와 같습니다. 지난 AppFlow와 다른 점은 이제서야 Scene을 띄워주기 위한 작업을 시작했다는건데요. 원래하시던대로 구현을 하시면 됩니다. 이 Flow에서 원하시는 ViewModel을 주입하는 것, 데이터를 전달하는 것 등을 구현하시면 됩니다. 당연한 이야기겠지만 여기서 navigationController는 root에서 사용한 것을 공유하셔야 합니다. 새로 만들거나 UINavigationController(rootViewController: ~)를 사용하시면 작동하지 않습니다. 마지막으로는 FlowContributors를 리턴하는 것인데요. 예제에서는 none으로 아무런 트리거도 일어나지 않게 했습니다. 자, 그렇다면 위의 navigate 메소드에서는 어떤 case가 작동할까요? 이건 우리가 전 FlowContributor에서 파라미터로 넣은 Stepper에 의해서 작동합니다. 이걸 알아봅시다.
2. Stepper 프로토콜을 곁들인 ViewModel
ViewModel의 다른 구현부는 제쳐두고 Stepper를 준수한 구현부만 살펴봅시다. 저는 기존에 구현해두었던 ArticleViewModel에 Stepper를 채택했습니다. 이유는 이곳에서 화면 전환을 담당하는 로직을 구성할 것이기 때문입니다. AppStepper에서 했던 것처럼 steps를 구현하고, initialStep으로 homeIsRequired를 방출합니다. 이 step이 우리가 위에서 만든 MainFlow의 navigate로 가겠죠? 이후에 발생하는 step은 steps에 바인딩합니다. 저는 Action 라이브러리로 ViewModel에서 cell이 select되는 로직을 미리 만들고 화면이 전환되도록 detailIsRequired step을 방출하는 코드를 구현했습니다.
3. 로직 정리하기
이렇게 구현을 해주시고 실행시켜주시면 첫 뷰인 ArticleViewController가 탁하고 뜹니다. (사실 네트워크 땜시 좀 시간이 걸립니다.) 대충 흐름을 정리하자면 이렇습니다.
FlowCoordinator 내부에서
AppStepper -> initialStep: homeIsRequired 방출 -> AppFlow root(window)를 구성하고, 이 step을 받아 navigate 실행 -> navigate의 navigateHomeFlow 메소드 실행 및 FlowContributors 반환
반환된 FlowContributor 내부에서
ArticleViewModel(Stepper) -> initialStep: homeIsRequired 방출 -> MainFlow root(UINavigationController)를 구성하고, 이 step을 받아 navigate 실행 -> navigate의 homeVCPresent 메소드 실행 및 none 반환 -> ViewController 인스턴스 생성되고 화면에 뜬다!
4. RxFlow 로직 Flow chart (내 맘대로 정리...)
이런 기초적인 로직이 계속해서 돌고 돕니다. 어떻게 보면 수박겉핥기식으로 본거긴하지만 (추상화된 명령코드들을... 다 이해하기가 어렵다ㅠ) 대략 어떻게 사용하는지, 어떤 로직으로 굴러가는지를 알면 사용하는데는 문제가 없습니다. 상대적으로 이해하고 사용하는데 시간이 오래 걸린다는 것, 작은 프로젝트에는 과한 엔지니어링일 수 있다는게 단점이긴한데, 익숙해지기만 한다면 기존 코디네이터 패턴보다 훨씬 간단하게 시작하고 사용할 수 있을 것 같습니다~
제가 적은 글은 잘못된 개념이 있을 수 있습니다:) 워낙 어려운 거라... 그런게 있다면 지적해주시고 같이 연구해가면 좋을 것 같습니다.
'RxSwift' 카테고리의 다른 글
[RxSwift Community] RxKeyboard 사용하기 (0) | 2021.06.19 |
---|---|
[RxSwift Community] RxFlow 사용하기 1 (0) | 2021.06.17 |
[RxSwift Community] RxFlow 사용하기 전에... (0) | 2021.06.11 |
[RxSwift Community] NSObject+Rx 사용하기 (0) | 2021.06.07 |
[RxSwift Community] RxDataSources Animatable편 (0) | 2021.06.04 |
댓글