apple/RxSwift, ReactorKit

[RxFlow] 나만의 RxFlow 정리 #1

lgvv 2022. 12. 1. 14:45

나만의 RxFlow 정리 #1

https://github.com/RxSwiftCommunity/RxFlow

 

배경

최근에 사이드 프로젝트를 수행하면서 Coordinator Pattern을 적용해 화면 구조를 만들었음.

 

해당 프로젝트 구조는 기본적으로 UIKit, ReactorKit, RxSwift를 기반으로 하고있고, 몇몇 화면과 컴포넌트들은 SwiftUI로 만들어서 UIHostingController를 사용하고 있음.

 

최근에는 Combine도 학습하고 있는데 RxSwift의 오퍼레이터들과 거의 비슷해서 이건 그냥 음,,, 딥하게 하지 않아도 알고 있는 것 같고.

TCA도 학습하고 있는데, RxFlow를 배워도 사용할 환경이 없을 것 같아서 조금 고민되긴 함

 

그래도 아직은 RxSwift 기반으로 작성하는 코드가 편하고, 화면전환에 있어서 RxSwfift는 RxFlow랑 잘 맞는다고 해서 학습해보고자 함.

 

 

Navigation concerns

요약하자면, 코드로 화면전환(커스텀 메커니즘)을 수행할 경우 디자인 패턴에(Coordinator, Router)에 따라 코드를 설정하기 어렵다는 문제가 있다고 함.

Regarding navigation within an iOS application, two choices are available:

  • Use the builtin mechanism provided by Apple and Xcode: storyboards and segues
  • Implement a custom mechanism directly in the code

The disadvantage of these two solutions:

  • Builtin mechanism: navigation is relatively static and the storyboards are massive. The navigation code pollutes the UIViewControllers
  • Custom mechanism: code can be difficult to set up and can be complex depending on the chosen design pattern (Router, Coordinator)

 

 

 

RxFlow aims to

요약하자면, RxFlow는 손쉽게 종속성 주입이 가능하고 모든 UIViewController에서 화면전환 메커니즘을 제거할 수 있음.

또한, 반응형 프로그래밍 및 선언적으로 방식으로 사용할 수 있게 되며, 논리 단위로 쉽게 나눌 수 있음.

  • Promote the cutting of storyboards into atomic units to enable collaboration and reusability of UIViewControllers
  • Allow the presentation of a UIViewController in different ways according to the navigation context
  • Ease the implementation of dependency injection
  • Remove every navigation mechanism from UIViewControllers
  • Promote reactive programming
  • Express the navigation in a declarative way while addressing the majority of the navigation cases
  • Facilitate the cutting of an application into logical blocks of navigation

 

 

 

The key principles


There are 6 terms you have to be familiar with to understand RxFlow:

  • Flow: each Flow defines a navigation area in your application. This is the place where you declare the navigation actions (such as presenting a UIViewController or another Flow).
  • Step: a Step is a way to express a state that can lead to a navigation. Combinations of Flows and Steps describe all the possible navigation actions. A Step can even embed inner values (such as Ids, URLs, ...) that will be propagated to screens declared in the Flows
  • Stepper: a Stepper can be anything that can emit Steps inside Flows.
  • Presentable: it is an abstraction of something that can be presented (basically UIViewController and Flow are Presentable).
  • FlowContributor: it is a simple data structure that tells the FlowCoordinator what will be the next things that can emit new Steps in a Flow.
  • FlowCoordinator: once the developer has defined the suitable combinations of Flows and Steps representing the navigation possibilities, the job of the FlowCoordinator is to mix these combinations to handle all the navigation of your app. FlowCoordinators are provided by RxFlow, you don't have to implement them.

 

필요한 부분만 추려서 가져옴

 

  • Flow : 각 Flow 는 애플리케이션의 화면전환 영역을 정의. 화면전환 작업(예: UIViewController 또는 다른 Flow 표시)을 선언하는 위치
  • Step : Step은 내비게이션으로 이어질 수 있는 상태를 표현하는 방법입니다. Flows 와 Steps 의 조합은 가능한 모든 탐색 작업을 설명합니다. Steps in Flow 에서 선언된 화면으로 전파될 내부 값(예: ID, URL 등)을 포함할 수도 있음
  • Stepper : Stepper 는 흐름 내에서 Step 를 내보낼 수 있는 모든 것이 될 수 있음.
  • Presentable : 표현될 수 있는 것의 추상화하여 사용(기본적으로 UIViewController  Flow  Presentable 임).
  • FlowContributor : Flow 에서 새 Steps 를 내보낼 수 있는 다음 항목이 무엇인지 FlowCoordinator 에 알려주는 간단한 데이터 구조.
  • FlowCoordinator : 개발자가 화면전환 가능성을 나타내는 Flows  Steps 의 적절한 조합을 정의하면 FlowCoordinator 의 작업은 이러한 조합을 혼합하여 앱의 모든 화면전환을 처리하는 것입니다. FlowCoordinator RxFlow에서 제공하므로 구현할 필요가 없음