iOS의 코디네이터 패턴
안녕 친구들!
코디네이터란?
코디네이터는 애플리케이션의 탐색 논리를 보유하는 시스템 구성 요소입니다. 패턴은 Soroush Khanlou 에 의해 소개되었습니다 .
코디네이터가 필요한 이유는 무엇입니까?
코디네이터 패턴을 사용하는 이점은 컨트롤러에서 탐색 책임을 제거한다는 것입니다. 이렇게 하면 재사용성을 높일 수 있으며 중앙 위치에서 앱 탐색을 할 수 있습니다. 코디네이터가 한 명이거나 어린이가 있는 메인 코디네이터가 있습니다.
앱 탐색에서 뷰 컨트롤러를 분리하면 프로젝트의 가독성을 높일 수 있습니다. 더 큰 앱에서는 특히 기능 팀이 있는 경우 시스템의 별도 구성 요소에서 앱 탐색이 필수적입니다.
목표는 상황에 따라 로직의 탐색을 쉽게 변경할 수 있도록 하는 것입니다. 예를 들어 사용자마다 흐름이 다르거나 iPad 사용자 또는 A/B 테스트가 격리되어 있을 수 있습니다.
코디네이터의 주요 특징.
- 하나의 코디네이터는 많은 ViewController를 가질 수 있습니다.
- 코디네이터에는 처음에 ViewController를 표시하는 시작 메서드가 있습니다.
- ViewController에는 코디네이터에 대한 참조가 있습니다.
- 코디네이터에는 하위 코디네이터 배열이 있습니다.
- 자식 코디네이터는 부모에 대한 참조를 가집니다.
protocol Coordinator: AnyObject {
var childCoordinators: [Coordinator] { get set }
var navigationController: UINavigationController { get set }
func start()
}
final class AppCoordnator: Coordinator {
// 1
var childCoordinators = [Coordinator]()
// 2
var navigationController: UINavigationController
// 3
init(navigationController: UINavigationController) {
self.navigationController = navigationController
}
// 4
func start() {
let controller = StartViewController()
controller.coordinator = self
navigationController.pushViewController(controller, animated: true)
}
}
- ViewController가 삽입될 UI 요소입니다.
- 생성자에 UI 요소를 삽입했습니다.
- 시작 방법은 ViewController의 초기화 및 navigationController와의 연결이 발생하는 곳입니다.
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// ...
let navigationController = UINavigationController()
let appCoordinator = AppCoordinator(navigationController: navigationController)
appCoordinator.applicationRunnerDelegate = self
appCoordinator.start()
window?.rootViewController = appCoordinator.navigationController
// ...
}
UITabBarController를 사용하는 코디네이터
앱의 기본 UI 구성 요소로 UITabBarController가 있을 때 코디네이터 패턴의 이점을 얻으려면 각 탭에 대해 코디네이터를 만들어야 합니다. 아래 예를 참조하십시오.
final class MainTabBarController: UITabBarController {
private let dashboardCoordinator: DashboardCoordnator
private let settingsCoordinator: SettingsCoordnator
init() {
self.dashboardCoordinator = DashboardCoordnator(navigationController: NavigationController())
self.settingsCoordinator = SettingsCoordnator(navigationController: NavigationController())
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// ...
viewControllers = [
makeDashboardCoordinator(),
makeSettingsCoordinator()
]
}
private func makeDashboardCoordinator() -> UINavigationController {
let tabImage = "dashboard_tab_icon"
let icon = UITabBarItem(title: "DASHBOARD",
image: UIImage(named: tabImage)?.withRenderingMode(.alwaysOriginal),,
selectedImage: UIImage(named: tabImage))
dashboardCoordinator.navigationController.tabBarItem = icon
dashboardCoordinator.start()
return dashboardCoordinator.navigationController
}
private func makeSettingsCoordinator() -> UINavigationController {
let tabImage = "settings_tab_icon"
let icon = UITabBarItem(title: "SETTINGS",
image: UIImage(named: tabImage)?.withRenderingMode(.alwaysOriginal),
selectedImage: UIImage(named: tabImage))
settingsCoordinator.navigationController.tabBarItem = icon
settingsCoordinator.start()
return settingsCoordinator.navigationController
}
}
ViewControllers에서 탐색 로직을 분리하면 클래스 응집력이 증가하고 시스템 결합이 감소합니다. 탐색 로직을 중앙 위치에 유지하고 재사용성과 테스트 가능성을 향상시킵니다.
의견이나 제안 또는 기타 사항에 대해...
연결하자:
인스 타 그램:https://www.instagram.com/gvardikos/
링크드인:https://www.linkedin.com/in/george-vardikos-b0b199b0/
이메일: [email protected]

![연결된 목록이란 무엇입니까? [1 부]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































