diff --git a/RxFlow/ain-RxFlow.md b/RxFlow/ain-RxFlow.md index 8b13789..26d9ee1 100644 --- a/RxFlow/ain-RxFlow.md +++ b/RxFlow/ain-RxFlow.md @@ -1 +1,130 @@ +# RxFlow +
+ +Coordinator 패턴을 RxSwift와 함께 사용할 수 있도록 랩핑한 프레임워크 + +


+ +## **Coordinator패턴과의 차이** + +
+ +- RxFlow에서는 화면을 **State**로, 화면 전환을 **Concept**로 정의한다. + +- Coordinator 패턴은 주로 동기적인 화면 전환을 처리한다면 RxFlow는 비동기적인 화면 전환을 처리한다. + +


+ +## RxFlow 사용법 + +
+ +```swift +enum AppStep: Step { + case firstScreen + case secondScreen +} +``` + +RxFlow를 프로젝트에 추가하고 State와 Concept를 정의한다. + +
+ +```swift +// FirstViewController +class FirstViewController: UIViewController, Stepper { + var steps = PublishRelay() + @IBAction func goToSecondScreenButtonTapped() { + steps.accept(AppStep.secondScreen) + } +} + +// SecondViewController +class SecondViewController: UIViewController, Stepper { + var steps = PublishRelay() +} +``` + +화면 전환에 사용되는 FirstViewController, SecondViewController + +

+ +```swift +class AppFlowCoordinator: FlowCoordinator { + var root: Presentable { + return self.navigationController + } + + let navigationController = UINavigationController() + + func navigate(to step: Step) -> FlowContributors { + guard let step = step as? AppStep else { return .none } + switch step { + case .firstScreen: + let firstViewController = FirstViewController() + firstViewController.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Next", style: .plain, target: self, action: #selector(goToSecondScreen)) + navigationController.viewControllers = [firstViewController] + return .one(flowContributor: .contribute(withNextPresentable: firstViewController, withNextStepper: firstViewController)) + case .secondScreen: + let secondViewController = SecondViewController() + navigationController.pushViewController(secondViewController, animated: true) + return .none + } + } + + @objc private func goToSecondScreen() { + steps.accept(AppStep.secondScreen) + } +} + +``` + +RxFlowCoordinator를 구현하여 각 Concept에 대한 화면 전환 로직을 처리한다. + +위 코드는 첫번째 화면의 Next버튼을 누르면 두번째 화면으로 전환되는 코드이다 ! + +

+ +```swift +let appFlow = AppFlowCoordinator() +let appStepper = OneStepper(withSingleStep: AppStep.firstScreen) + +Flows.whenReady(flow1: appFlow, block: { [unowned self] root in + self.window.rootViewController = root + self.window.makeKeyAndVisible() +}) + +self.coordinator.coordinate(flow: appFlow, with: appStepper) +``` + +AppDelegate에 RxFlow를 초기화하고 실행하는 코드를 작성한다. + +

+ +- **Flow**: 어플리케이션 내부의 네비게이션 공간 + + 화면 전환을 관리하며, 각 Flow 내에서 화면 전환 스택을 관리한다. + +- **Step**: 어플리케이션 내부의 네비게이션 상태 + +- **Stepper**: 사용자의 입력 또는 이벤트를 통해 화면 전환을 시작하는 역할 + +- **Presentable**: Flow 내부에서 화면을 나타내는데 사용되는 프로토콜 + + UIViewController나 UINavigationController를 채택하며, Flow 내에서 화면을 나타내는 역할을 한다. + +- **NextFlowItem**: 현재 화면 전환 이후에 다음에 어떤 화면이 나타날지를 정의하는 객체 + + Step과 함께 사용되며 다음 화면을 결정하는 역할을 한다. + +


+ + +## RxFlow의 장점 + +
+ +- Coordinator 패턴을 쉽게 적용할 수 있다. + +- 앱의 화면 전환을 효과적으로 관리할 수 있다. \ No newline at end of file