์๋ ํ์ธ์.
์ค๋์ Coordinator ๋์์ธ ํจํด์ ๋ํด์ ๊ฐ๋จํ๊ฒ ์๊ฐํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ต๊ทผ์ ์งํํ๊ณ ์๋ ํ๋ก์ ํธ์์ ์ฌ์ฉ ์ค์ธ๋ฐ
Coordinator ์ฌ์ฉ์ ์์ด ๋ญ๊ฐ ์๋ชป ์ฌ์ฉํ๊ณ ์๋ค๊ณ ์๊ฐ๋์ด ๋ค์ ๊ณต๋ถํ ๊ฒธ ํฌ์คํ ๋จ๊ฒจ๋ด ๋๋ค.
Coordinator
Coordinator ๋์์ธ ํจํด์ ๊ธฐ์กด์ ViewController์์ ์ฒ๋ฆฌํ๋ ํ๋ฉด์ ํ์ด๋ ํ๋ฆ์ ๋ถ๋ฆฌํ์ฌ ๋ด๋นํ๋ ๋์์ธ ํจํด์ ๋๋ค.
์ฆ, ViewController๊ฐ ๋ค๋ฅธ ViewController๋ฅผ ์ง์ ํธ์ํ๊ฑฐ๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ Coordinator๊ฐ ๋ด๋นํ๊ฒ ๋๋ฉด์ ๋ช ํํ ์ญํ ์ ๋ถ๋ฆฌ๊ฐ ์๊ธฐ๊ฒ ๋๊ณ ์ด๋ ๊ฒ ๋ช ํํ ์ญํ ์ ๋ถ๋ฆฌ๋ก ๋ ๊น๋ํ ์ฝ๋, ํ์ฅ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ์ด์ ์ ๊ฐ์ ธ๊ฐ ์ ์์ต๋๋ค.
์ฅ๋จ์
์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ ๊ธฐ์กด์ ViewController๊ฐ ํ๋ ํ๋ฉด์ ํ์ด๋ ํ๋ฆ์ ์ด์ ์ญํ ์
Coordinator๊ฐ ๋ด๋นํ๊ฒ ๋๋ฉด์ ๋ช ํํ ์ญํ ์ ๋ถ๋ฆฌ๋ฅผ ๊ธฐ๋ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํฉ๋๋ค.
์์ฃผ ๋ด์๋ ๊ฒ์ฒ๋ผ ์ญํ ์ด ๋ถ๋ฆฌ๋๋ค๋ฉด ViewController์ Coordinator๋ฅผ ๊ฐ๋ณ์ ์ธ ํ ์คํธ๋ฅผ ์งํํ ์ ์๊ฒ ๋๊ณ , ํ๋์ Coordinator๊ฐ ์ฌ๋ฌ ViewController์ ํ๋ฉด์ ํ์ ์ฌ์ฉ์ด ๋ ์ ์๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ๋งค๋ฒ ํ๋ฉด์ ํ ํจ์๋ฅผ ๋ง๋ค์ด ์ฒ๋ฆฌํ์ง ์์ ์ ์๊ฒ ๋์ด ์ฌ์ฌ์ฉ์ฑ ์ธก๋ฉด์์๋ ๊ต์ฅํ ์ด์ ์ด ์์ต๋๋ค.
๋จ์ ์ด ์๋ค๋ฉด ์์ ์ฑ์ด๋ ๊ฐ๋จํ ํ์(1ํ์ฑ, ์์ฃผ ์ฌ์ฉํ์ง ์๋ ํ๋ฉด์ ํ์ด๋ ํ๋ฆ ์ ์ด)์ Coordinator๋ฅผ ๋์ ํ ์์๋ ์คํ๋ ค ๋ถํ์ํ ๋ณต์ก์ฑ๋ง ์ถ๊ฐ๋ ์ ์์ต๋๋ค.
๋น๊ตํด ๋ณด์
์๋๋ ๊ธฐ์กด์ ViewController์์ ๋ด๋นํ๋ ํ๋ฉด์ ํ ๋ก์ง์ ๋๋ค.
LoginViewController์ ์ธ์คํด์ค๋ฅผ ํจ์ ๋ด์์ ์์ฑํ๊ณ
์์ ๋ทฐ์ปจํธ๋กค๋ฌ์ธ navigationController์๊ฒ push๋ฅผ ์์ฒญํ๊ณ ์์ต๋๋ค.
class MyViewController: UIViewController {
...
func showLgoinViewController() {
let loginViewController = LoginViewController()
self.navigationController?.pushViewController(loginViewController, animated: true)
}
}
Coordinator๋ฅผ ์ด์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
1. Coordinator ํ๋กํ ์ฝ ๊ตฌํ
protocol Coordinator: AnyObject {
var navigationController: UINavigationController { get set }
var childCoordinators: [Coordinator] { get set }
func start()
init(_ navigationController: UINavigationController)
}
2. ํด๋น ํ๋กํ ์ฝ์ ์ฑํํ Coordinator
class LoginCoordinator: Coordinator {
var navigationController: UINavigationController
var childCoordinators = [Coordinator]()
init(_ navigationController: UINavigationController) {
self.navigationController = navigationController
}
func start() {
let loginViewController = LoginViewController()
navigationController.pushViewController(loginViewController, animated: false)
}
}
- ์์ฑ์๋ฅผ ํตํด ๋ฐ์ NavigationController๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ฉด์ ํ์ด ์ด๋ฃจ์ด์ง๋๋ค.
3. Coordinator ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ start() ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
๋ก๊ทธ์ธ ํ๋ฉด์ด ๊ฐ์ฅ ์ฒซ ํ๋ฉด์ด๋ผ๋ ๊ฐ์ ํ์ ์์ฑํ์ต๋๋ค.
๋ณดํต AppCoordinator๋ผ๋ Coordinator๋ฅผ ๋ง๋ค์ด ์ ์ ๊ฐ ๊ฐ์ ์ด ๋์๋์ง ์๋์๋์ง์ ๋ฐ๋ผ ๋ก๊ทธ์ธํ๋ฉด์ผ๋ก ๊ฐ์ง, ํํ๋ฉด์ผ๋ก ๊ฐ์ง ๋ฑ์ ํ๋จํฉ๋๋ค.
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var coordinator: LoginCoordinator?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let navigationController = UINavigationController()
coordinator = LoginCoordinator(navigationController)
coordinator?.start()
window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = navigationController
window?.makeKeyAndVisible()
return true
}
}
์ด๋ ๊ฒ ํ๋ฉด ์ฑ์ด ์คํ๋์์ ๋, LoginCoordinator์ start() ํจ์๊ฐ ํธ์ถ๋๊ณ ํ๋ฉด์๋ LoginViewController๊ฐ ๋์ค๊ฒ ๋ฉ๋๋ค.
4. ์กฐ๊ธ ๋ ์์๋ณด์.
๋ง์ฝ ๋ก๊ทธ์ธ ์ฑ๊ณต ์ ํ์ผ๋ก ํ๋ฉด์ ํ์ ํ๊ณ ์ถ๋ค๋ฉด ์ฌ๋ฌ ๊ฐ์ง ์์๋ฅผ ์์ฑํ ์ ์์ง๋ง
delegate ํจํด์ ํ์ฉํ ๊ฒฝ์ฐ์ ๋ํด์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
protocol LoginViewModelDelegate {
func showHomeViewController()
}
class LoginViewModel {
weak var delegate: LoginViewModelDelegate?
...
func showHomeViewController() {
delegate?.showHomeViewController()
}
}
class LoginCoordinator: Coordinator {
...
func start() {
let viewModel = LoginViewModel()
let loginViewController = LoginViewController(viewModel: viewModel)
viewModel.delegate = self
navigationController.pushViewController(loginViewController, animated: false)
}
}
// MARK: - Navigation
extension LoginCoordinator: LoginViewModelDelegate {
func showHomeViewController() {
let coordinator = HomeCoordinator(navigationController)
childCoordinators.append(coordinator)
coordinator.start()
}
}
๋ก๊ทธ์ธ ์ฑ๊ณต ์ ViewModel์์ showHomeViewController ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฒฝ์ฐ, delegate๋ฅผ ์ฑํํ๊ณ ์๋ LoginCoordinator์ showHomeViewController๊ฐ ํธ์ถ๋๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ๊ธฐ์กด์ Coordinator๋ค์ HomeCoordinator๊ฐ ์ถ๊ฐ๋๊ณ , start ๋ฉ์๋๋ฅผ ํธ์ถํจ์ผ๋ก์จ ํ๋ฉด์ ํ์ด ์ด๋ฃจ์ด์ง๊ฒ ๋ฉ๋๋ค.
๋ค์ ๊ณต๋ถํด์ผ๊ฒ ๋ค
์ ์ ๊ฒฝ์ฐ์๋ ViewModel์ ์์ฑ์์ Coordinator๋ฅผ ์ถ๊ฐํ์ฌ ViewModel ๋ด๋ถ์์ Coordinator๋ฅผ ์ฌ์ฉํ์์ต๋๋ค.
class LoginViewModel {
weak var coordinator: HomeCoordinator?
init(coordinator: HomeCoordinator...) {
self.coordinator = coordiantor
...
}
func showHomeViewController() {
coordinator?.showHomeViewController()
}
}
์๋ฅผ ๋ค์ด ์์ฒ๋ผ ์ฌ์ฉํ์์ต๋๋ค.
ViewModel์์ coordinator๋ฅผ ๋ฐ์ ์ฌ์ฉํ๋ค ๋ณด๋ ํน์ ํ ๋ทฐ์ปจํธ๋กค๋ฌ๊ฐ Home, Profile, Chat ๋ฑ Coordinator์์ ๋ชจ๋ ์ฌ์ฉ๋๊ฒ ๋ ๊ฒฝ์ฐ์๋ ํด๋น ๋ทฐ๋ชจ๋ธ๋ค์ ์์ฑ์๋ฅผ Coordinator ํ๋กํ ์ฝ๋ก ๋ฐ์ ์ฌ์ฉํ ์๋ฐ์ ์์์ต๋๋ค.
ํ๋กํ ์ฝ๋ก ๋ฐ์์ ์ฌ์ฉํ๋ค๊ณ ํ๋๋ผ๊ณ ์ด๋ค Coordinator์ธ์ง ( Chat, Profile, Home...) ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ๋งค๋ฒ ํด์ผ๋ง ํ์์ต๋๋ค.
์ด๋ฒ ํฌ์คํ ์ ์์ฑํ๋ฉด์ delegate ํจํด์ ํ์ฉํ๋ฉด ์์ ๊ฐ์ ๋ชป๋์ด ์ฝ๋๋ฅผ ์์ฑํ์ง ์๊ฒ ๋ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋๋ค์.
์๋ฌด์ชผ๋ก ๋์์ด ๋์ จ์ผ๋ฉด ์ข๊ฒ ๋ค์.
๊ทธ๋ผ ์ด๋ง ๐๐ป ๐๐ป ๐๐ป