Coordinator - Team-HGD/SniffMEET GitHub Wiki

ViewController ์ด์šฉํ•œ ํ™”๋ฉด ์ „ํ™˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋“ค์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•

  • ViewController์—์„œ pop, push ๋“ฑ์„ ์ด์šฉํ•œ ํ™”๋ฉด ์ „ํ™˜๊นŒ์ง€ ๋‹ด๋‹นํ•˜๋Š” ๋งŽ์€ ์ฑ…์ž„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • ์ปค์ง„ VC์—์„œ ํ™”๋ฉด ์ „ํ™˜ ๋กœ์ง๋งŒ์„ ์ฐพ์•„ ํ™•์ธํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ ๋ฒˆ๊ฑฐ๋กญ๋‹ค.
  • VC์—์„œ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋„ˆ๋ฌด ๋†’๋‹ค.
  • ํ™”๋ฉด ์ „ํ™˜์„ ์œ„ํ•œ VC๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ์ „ํ™˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

Coordinator ํŒจํ„ด

ํ™”๋ฉด ์ „ํ™˜ ๋กœ์ง์„ ๊ด€๋ฆฌํ•˜๋Š” Coordinator ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ViewController๊ฐ€ ์•„๋‹Œ Coordinator๊ฐ€ ํ•ด๋‹น ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค. Coordinator๋Š” ์•ฑ์˜ ์ฃผ์š” ํ๋ฆ„์„ ์ปจํŠธ๋กคํ•˜๋ฉฐ, ๊ฐ ๋ถ€๋ถ„์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ Coordinator๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Coordinator1

ํŠน์ง•

  • ๋‹จ์ผ ์ฑ…์ž„ ์›์น™
    • ํ™”๋ฉด ์ „ํ™˜ ์—ญํ• ์„ ํ•˜๋Š” ๊ฐ์ฒด์ธ Coordinator์˜ ์กด์žฌ๋กœ, VC์€ UI์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์–ด์ง„๋‹ค.
  • ์žฌ์‚ฌ์šฉ์„ฑ
    • Coordinator๋Š” ํŠน์ • ํ”Œ๋กœ์šฐ๋ฐ ๋”ฐ๋ผ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋™์ผํ•œ ํ”Œ๋กœ์šฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํ™”๋ฉด ์ „ํ™˜ ๋กœ์ง ๋ณ€๊ฒฝ
    • Coordinator์—์„œ ํ™”๋ฉด ์ „ํ™˜๊ณผ ๋„ค๋น„๊ฒŒ์ด์…˜์„ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋กœ์ง ์ˆ˜์ •์ด ๋” ๊ฐ„๋‹จํ•˜๋‹ค.
  • ์ˆœํ™˜ ์ฐธ์กฐ
    • Coordinator์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์ˆœํ™˜ ์ฐธ์กฐ์˜ ์œ„ํ—˜์„ฑ์ด ๋ฐœ์ƒํ•œ๋‹ค.
    • ๋ฐฐ์—ด์— Coordinator๋ฅผ ์ €์žฅํ•˜๊ณ , ํ•„์š” ์—†๋Š” ๊ฒฝ์šฐ ํ•ด์ œํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ™•์žฅ์„ฑ
    • ๋ณต์žกํ•œ ํ™”๋ฉด ์ „ํ™˜ ํ”Œ๋กœ์šฐ๋ฅผ ๊ฐ€์ง„ ๋Œ€๊ทœ๋ชจ ์•ฑ์ผ์ˆ˜๋ก ์ ํ•ฉํ•˜๋‹ค.

๊ธฐ๋ณธ ๊ตฌ์„ฑ

  • Coordinator ํ”„๋กœํ† ์ฝœ
    • ๋ชจ๋“  ์ฝ”๋””๋„ค์ดํ„ฐ๋Š” ๊ณตํ†ต๋œ ๋ฉ”์„œ๋“œ๋ฅผ ๋”ฐ๋ฅด๊ธฐ ์œ„ํ•ด์„œ ์ฝ”๋””๋„ค์ดํ„ฐ ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•œ๋‹ค.
  • App Coordinator
    • ์•ฑ์˜ ๊ณตํ†ต ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ฃผ๋กœ ์ž์‹ ์ฝ”๋””๋„ค์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.
  • ๊ฐ๊ฐ์˜ Coordinator
    • ํŠน์ • ํ๋ฆ„์„ ๋‹ด๋‹นํ•˜๋Š” ์ฝ”๋””๋„ค์ดํ„ฐ(์œ„์—์„œ ๋งํ•œ ์ž์‹ ์ฝ”๋“œ๋„ค์ดํ„ฐ)๋กœ, ๊ฐ๊ฐ์˜ ํ๋ฆ„์„ ๊ด€๋ฆฌํ•˜๊ณ  VC๊ณผ์˜ ๋„ค๋น„๊ฒŒ์ด์…˜์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • Delegate ํŒจํ„ด / Closure
    • ์ƒ์œ„ ์ฝ”๋””๋„ค์ดํ„ฐ์™€ ํ•˜์œ„ ์ฝ”๋””๋„ค์ดํ„ฐ๊ฐ€ ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉํ• ๋•Œ ์ฃผ๋กœ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋‚˜ ํด๋กœ์ €๋กœ ์ƒํ˜ธ์ž‘์šฉํ•œ๋‹ค.
    • ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ์™€ ํด๋กœ์ €๋กœ ์ƒํ˜ธ์ž‘์šฉ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋””๋„ค์ดํ„ฐ๋ฅผ ๋…๋ฆฝ์ ์ธ ๋ชจ๋“ˆ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ”Œ๋กœ์šฐ

  • ๊ธฐ๋ณธ ํ™”๋ฉด ์ „ํ™˜

Coordinator2

  • Coordinator ํ™”๋ฉด ์ „ํ™˜

    Coordinator ์ž์ฒด๊ฐ€ ํ™”๋ฉด ์ „ํ™˜ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ™”๋ฉด๋ผ๋ฆฌ์˜ ์ „ํ™˜ ๋กœ์ง์ด ํ•„์š”ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Coordinator์™€ ์—ฐ๊ฒฐ๋˜์–ด ํ™”๋ฉด ์ „ํ™˜์„ ์š”์ฒญํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

Coordinator3

์‚ฌ์šฉ

  1. Coordinator ํ”„๋กœํ† ์ฝœ
protocol Coordinator {
    var childCoordinators: [Coordinator] { get set }
    var navigationController: UINavigationController { get set }
    
    func start()
}
  • childCoordinators : ํ•˜์œ„ Coordinator ๊ฐ€ ๋“ค์–ด๊ฐˆ ๋ฐฐ์—ด
  • navigationController : ์ž์‹  ViewController๋“ค์„ ๋ณด์—ฌ์ค„ ์—ญํ• 
  • start() : ํ•ด๋‹น Coordinator๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ํ™”๋ฉด ํ‘œ์‹œํ•˜๋Š” ๋ฉ”์„œ๋“œ
  1. AppCoordinator - ์ฝ”๋””๋„ค์ดํ„ฐ์˜ ์ตœ์ƒ์œ„
class AppCoordinator: Coordinator {
    var childCoordinators = [Coordinator]()
    var navigationController: UINavigationController

    init(navigationController: UINavigationController) {
        self.navigationController = navigationController
    }

    func start() {
        let authCoordinator = AuthCoordinator(navigationController: navigationController)
        authCoordinator.parentCoordinator = self
        childCoordinators.append(authCoordinator)
        authCoordinator.start()
    }

    func didFinishAuth() {
		    // ํšŒ์›๊ฐ€์ž… ๋๋‚ฌ์œผ๋‹ˆ ๋กœ๊ทธ์ธ ํ™”๋ฉด์œผ๋กœ ๋„˜์–ด๊ฐ€๊ธฐ
        let loginCoordinator = LoginCoordinator(navigationController: navigationController)
        childCoordinators.append(loginCoordinator)
        loginCoordinator.start()
    }
}
  1. AuthCoordinator
class AuthCoordinator: Coordinator {
    var childCoordinators = [Coordinator]()
    var navigationController: UINavigationController
    weak var parentCoordinator: AppCoordinator?

    init(navigationController: UINavigationController) {
        self.navigationController = navigationController
    }

    func start() {
        let authViewController = AuthViewController()
        authViewController.coordinator = self
        navigationController.pushViewController(authViewController, animated: true)
    }

    func didFinishAuth() {
        parentCoordinator?.didFinishAuth()
    }
}
  1. AuthViewController
class AuthViewController: UIViewController {
    weak var coordinator: AuthCoordinator?

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        // ํšŒ์›๊ฐ€์ž… UI ์„ค์ •
    }

    func authSuccessButtonTapped() {
        // ํšŒ์›๊ฐ€์ž… ๋กœ์ง
        coordinator?.didFinishLogin()
    }
}

์ฐธ๊ณ 

https://velog.io/@kimscastle/iOS-Coordinator-Pattern-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0

https://mini-min-dev.tistory.com/264