Open SuniDev opened 4 months ago
AuthCoordinator์์ MainCoordinator๋ก ๋ณํํ๋ ๊ฒ์ ์ฌ์ฉ์ ์ธ์ฆ์ด ์๋ฃ๋ ํ ๋ฉ์ธ ์ฑ ํ๋ฆ์ผ๋ก ์ ํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด ์์ ์ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ฅผ ํตํด ์ํํ ์ ์์ต๋๋ค:
AuthCoordinator
MainCoordinator
์ด๋ฅผ ์ํด์๋ AuthCoordinator๊ฐ MainCoordinator๋ก์ ์ ํ์ ๊ด๋ฆฌํ๋ ์์ Coordinator ๋๋ AppDelegate/SceneDelegate์ ๊ฐ์ ์์ ๊ณ์ธต์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
์์ Coordinator์์ ์ํธ์์ฉ์ ์ํด ๊ธฐ๋ณธ Coordinator ํ๋กํ ์ฝ์ ๋ถ๋ชจ Coordinator์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
protocol Coordinator { var navigationController: UINavigationController { get set } var parentCoordinator: Coordinator? { get set } func start() }
AuthCoordinator๋ ์ธ์ฆ์ด ์๋ฃ๋๋ฉด MainCoordinator๋ฅผ ์์ํฉ๋๋ค.
class AuthCoordinator: Coordinator { var navigationController: UINavigationController var parentCoordinator: Coordinator? init(navigationController: UINavigationController) { self.navigationController = navigationController } func start() { let loginViewController = LoginViewController() loginViewController.coordinator = self navigationController.pushViewController(loginViewController, animated: true) } func didFinishAuthentication() { parentCoordinator?.childDidFinish(self) let mainCoordinator = MainCoordinator(navigationController: navigationController) mainCoordinator.parentCoordinator = parentCoordinator parentCoordinator?.childDidStart(mainCoordinator) mainCoordinator.start() } }
MainCoordinator๋ ๊ธฐ๋ณธ ๋ค๋น๊ฒ์ด์ ํ๋ฆ์ ์ฒ๋ฆฌํฉ๋๋ค.
class MainCoordinator: Coordinator { var navigationController: UINavigationController var parentCoordinator: Coordinator? init(navigationController: UINavigationController) { self.navigationController = navigationController } func start() { let viewController = MainViewController() viewController.coordinator = self navigationController.pushViewController(viewController, animated: true) } func showDetail() { let detailViewController = DetailViewController() navigationController.pushViewController(detailViewController, animated: true) } }
์์ Coordinator๋ ์ฑ์ ์ ๋ฐ์ ์ธ ํ๋ฆ์ ๊ด๋ฆฌํ๊ณ , ์์ Coordinator๋ฅผ ์์ํ๊ฑฐ๋ ์ข ๋ฃํฉ๋๋ค.
class RootCoordinator: Coordinator { var navigationController: UINavigationController var childCoordinator: Coordinator? init(navigationController: UINavigationController) { self.navigationController = navigationController } func start() { showAuthentication() } func showAuthentication() { let authCoordinator = AuthCoordinator(navigationController: navigationController) authCoordinator.parentCoordinator = self childCoordinator = authCoordinator authCoordinator.start() } func showMain() { let mainCoordinator = MainCoordinator(navigationController: navigationController) mainCoordinator.parentCoordinator = self childCoordinator = mainCoordinator mainCoordinator.start() } func childDidFinish(_ child: Coordinator?) { if child === childCoordinator { childCoordinator = nil } } func childDidStart(_ child: Coordinator) { childCoordinator = child } }
AppDelegate ๋๋ SceneDelegate์์ RootCoordinator๋ฅผ ์ด๊ธฐํํ๊ณ ์์ํฉ๋๋ค.
AppDelegate
SceneDelegate
RootCoordinator
import UIKit class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? var rootCoordinator: RootCoordinator? func scene( _ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions ) { guard let windowScene = (scene as? UIWindowScene) else { return } let navController = UINavigationController() window = UIWindow(windowScene: windowScene) window?.rootViewController = navController window?.makeKeyAndVisible() rootCoordinator = RootCoordinator(navigationController: navController) rootCoordinator?.start() } }
didFinishAuthentication
์ด ๋ฐฉ๋ฒ์ ํตํด AuthCoordinator์์ MainCoordinator๋ก ์ ํํ ์ ์์ต๋๋ค. ์ด ํจํด์ ์ฌ์ฉํ๋ฉด ์ฑ์ ๋ค๋น๊ฒ์ด์ ํ๋ฆ์ ๋ช ํํ๊ฒ ๊ด๋ฆฌํ๊ณ , ์ฝ๋์ ์ ์ง๋ณด์์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
๋ด๋น๊ฒ์ด์ ๋ก์ง์ ViewController์์ ๋ถ๋ฆฌํ๋ ๊ฒ์ ์ฝ๋์ ์ ์ง๋ณด์์ฑ, ํ ์คํธ ์ฉ์ด์ฑ, ํ์ฅ์ฑ ๋ฑ์ ํฌ๊ฒ ๊ฐ์ ํ ์ ์์.
๐ก ์์ฝ
[์ฐธ๊ณ ]
AuthCoordinator
์์MainCoordinator
๋ก ๋ณํํ๋ ๊ฒ์ ์ฌ์ฉ์ ์ธ์ฆ์ด ์๋ฃ๋ ํ ๋ฉ์ธ ์ฑ ํ๋ฆ์ผ๋ก ์ ํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด ์์ ์ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ฅผ ํตํด ์ํํ ์ ์์ต๋๋ค:AuthCoordinator
๋ฅผ ์ข ๋ฃํ๊ณ ,MainCoordinator
๋ฅผ ์์ํ๋ ๊ฒ์ ๋๋ค.์ด๋ฅผ ์ํด์๋
AuthCoordinator
๊ฐMainCoordinator
๋ก์ ์ ํ์ ๊ด๋ฆฌํ๋ ์์ Coordinator ๋๋ AppDelegate/SceneDelegate์ ๊ฐ์ ์์ ๊ณ์ธต์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค.Step-by-Step Guide
1. Coordinator ํ๋กํ ์ฝ ์์ (์ต์ )
์์ Coordinator์์ ์ํธ์์ฉ์ ์ํด ๊ธฐ๋ณธ Coordinator ํ๋กํ ์ฝ์ ๋ถ๋ชจ Coordinator์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
2. AuthCoordinator ๊ตฌํ
AuthCoordinator
๋ ์ธ์ฆ์ด ์๋ฃ๋๋ฉดMainCoordinator
๋ฅผ ์์ํฉ๋๋ค.3. MainCoordinator ๊ตฌํ
MainCoordinator
๋ ๊ธฐ๋ณธ ๋ค๋น๊ฒ์ด์ ํ๋ฆ์ ์ฒ๋ฆฌํฉ๋๋ค.4. RootCoordinator ๊ตฌํ (์์ Coordinator)
์์ Coordinator๋ ์ฑ์ ์ ๋ฐ์ ์ธ ํ๋ฆ์ ๊ด๋ฆฌํ๊ณ , ์์ Coordinator๋ฅผ ์์ํ๊ฑฐ๋ ์ข ๋ฃํฉ๋๋ค.
5. AppDelegate ๋๋ SceneDelegate์์ RootCoordinator ์ฌ์ฉ
AppDelegate
๋๋SceneDelegate
์์RootCoordinator
๋ฅผ ์ด๊ธฐํํ๊ณ ์์ํฉ๋๋ค.์์ฝ
AuthCoordinator
์์ ์ธ์ฆ์ด ์๋ฃ๋๋ฉดdidFinishAuthentication
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์ Coordinator์๊ฒ ์๋ฆฝ๋๋ค.AuthCoordinator
๋ฅผ ์ข ๋ฃํ๊ณ , ์๋ก์ดMainCoordinator
๋ฅผ ์์ํฉ๋๋ค.RootCoordinator
๋ ์์ Coordinator์ ์์ ๋ฐ ์ข ๋ฃ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.์ด ๋ฐฉ๋ฒ์ ํตํด
AuthCoordinator
์์MainCoordinator
๋ก ์ ํํ ์ ์์ต๋๋ค. ์ด ํจํด์ ์ฌ์ฉํ๋ฉด ์ฑ์ ๋ค๋น๊ฒ์ด์ ํ๋ฆ์ ๋ช ํํ๊ฒ ๊ด๋ฆฌํ๊ณ , ์ฝ๋์ ์ ์ง๋ณด์์ฑ์ ๋์ผ ์ ์์ต๋๋ค.