iOS의 코디네이터 패턴

Feb 26 2023
안녕 친구들! 코디네이터란? 코디네이터는 애플리케이션의 탐색 논리를 보유하는 시스템 구성 요소입니다. 패턴은 Soroush Khanlou에 의해 소개되었습니다.

안녕 친구들!

코디네이터란?

코디네이터는 애플리케이션의 탐색 논리를 보유하는 시스템 구성 요소입니다. 패턴은 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)
    }
}

  1. ViewController가 삽입될 UI 요소입니다.
  2. 생성자에 UI 요소를 삽입했습니다.
  3. 시작 방법은 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]