Coordinator - Team-HGD/SniffMEET GitHub Wiki
ViewController ์ด์ฉํ ํ๋ฉด ์ ํ์์ ๋ฐ์ํ๋ ์ฌ๋ฌ ๋ฌธ์ ๋ค์ ์ค์ด๊ธฐ ์ํ ๋ฐฉ๋ฒ
- ViewController์์ pop, push ๋ฑ์ ์ด์ฉํ ํ๋ฉด ์ ํ๊น์ง ๋ด๋นํ๋ ๋ง์ ์ฑ ์์ ๊ฐ์ง๊ณ ์๋ค.
- ์ปค์ง VC์์ ํ๋ฉด ์ ํ ๋ก์ง๋ง์ ์ฐพ์ ํ์ธํ๊ณ ์์ ํ๊ธฐ ๋ฒ๊ฑฐ๋กญ๋ค.
- VC์์ ์ฒ๋ฆฌํ๋ฉด์ ๊ฒฐํฉ๋๊ฐ ๋๋ฌด ๋๋ค.
- ํ๋ฉด ์ ํ์ ์ํ VC๋ง๋ค ์๋กญ๊ฒ ์ธ์คํด์ค๋ฅผ ์์ฑํด์ผ ์ ํ์ํฌ ์ ์๋ค.
Coordinator ํจํด
ํ๋ฉด ์ ํ ๋ก์ง์ ๊ด๋ฆฌํ๋ Coordinator ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ViewController๊ฐ ์๋ Coordinator๊ฐ ํด๋น ์ญํ ์ ์ํํ๋๋ก ํ๋ ๊ตฌ์กฐ์ด๋ค. Coordinator๋ ์ฑ์ ์ฃผ์ ํ๋ฆ์ ์ปจํธ๋กคํ๋ฉฐ, ๊ฐ ๋ถ๋ถ์ ๋ฐ๋ผ ์ฌ๋ฌ Coordinator๊ฐ ์กด์ฌํ ์ ์๋ค.
ํน์ง
- ๋จ์ผ ์ฑ
์ ์์น
- ํ๋ฉด ์ ํ ์ญํ ์ ํ๋ ๊ฐ์ฒด์ธ Coordinator์ ์กด์ฌ๋ก, VC์ UI์๋ง ์ง์คํ ์ ์์ด์ง๋ค.
- ์ฌ์ฌ์ฉ์ฑ
- Coordinator๋ ํน์ ํ๋ก์ฐ๋ฐ ๋ฐ๋ผ ์ฌ๋ฌ๊ฐ๊ฐ ์์ ์ ์๋๋ฐ, ๋์ผํ ํ๋ก์ฐ๊ฐ ํ์ํ๋ค๋ฉด ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
- ํ๋ฉด ์ ํ ๋ก์ง ๋ณ๊ฒฝ
- Coordinator์์ ํ๋ฉด ์ ํ๊ณผ ๋ค๋น๊ฒ์ด์ ์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋ก์ง ์์ ์ด ๋ ๊ฐ๋จํ๋ค.
- ์ํ ์ฐธ์กฐ
- Coordinator์ ๊ฐ์๊ฐ ๋ง์์ง์๋ก ์ํ ์ฐธ์กฐ์ ์ํ์ฑ์ด ๋ฐ์ํ๋ค.
- ๋ฐฐ์ด์ Coordinator๋ฅผ ์ ์ฅํ๊ณ , ํ์ ์๋ ๊ฒฝ์ฐ ํด์ ํ๋ ๋ฐฉ์์ผ๋ก ๋ฐฉ์งํ ์ ์๋ค.
- ํ์ฅ์ฑ
- ๋ณต์กํ ํ๋ฉด ์ ํ ํ๋ก์ฐ๋ฅผ ๊ฐ์ง ๋๊ท๋ชจ ์ฑ์ผ์๋ก ์ ํฉํ๋ค.
๊ธฐ๋ณธ ๊ตฌ์ฑ
- Coordinator ํ๋กํ ์ฝ
- ๋ชจ๋ ์ฝ๋๋ค์ดํฐ๋ ๊ณตํต๋ ๋ฉ์๋๋ฅผ ๋ฐ๋ฅด๊ธฐ ์ํด์ ์ฝ๋๋ค์ดํฐ ํ๋กํ ์ฝ์ ์ฑํํ๋ค.
- App Coordinator
- ์ฑ์ ๊ณตํต ๋ค๋น๊ฒ์ด์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ์ฃผ๋ก ์์ ์ฝ๋๋ค์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ฑฐ๋ ํ์ฌ ์ํ๋ฅผ ์ ์งํ๋ค.
- ๊ฐ๊ฐ์ Coordinator
- ํน์ ํ๋ฆ์ ๋ด๋นํ๋ ์ฝ๋๋ค์ดํฐ(์์์ ๋งํ ์์ ์ฝ๋๋ค์ดํฐ)๋ก, ๊ฐ๊ฐ์ ํ๋ฆ์ ๊ด๋ฆฌํ๊ณ VC๊ณผ์ ๋ค๋น๊ฒ์ด์ ์ ์ํํ๋ค.
- Delegate ํจํด / Closure
- ์์ ์ฝ๋๋ค์ดํฐ์ ํ์ ์ฝ๋๋ค์ดํฐ๊ฐ ์๋ก ์ํธ์์ฉํ ๋ ์ฃผ๋ก ๋ธ๋ฆฌ๊ฒ์ดํธ๋ ํด๋ก์ ๋ก ์ํธ์์ฉํ๋ค.
- ๋ธ๋ฆฌ๊ฒ์ดํธ์ ํด๋ก์ ๋ก ์ํธ์์ฉ ํ๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ค์ดํฐ๋ฅผ ๋ ๋ฆฝ์ ์ธ ๋ชจ๋๋ก ์ ์งํ ์ ์๋ค.
ํ๋ก์ฐ
- ๊ธฐ๋ณธ ํ๋ฉด ์ ํ
-
Coordinator ํ๋ฉด ์ ํ
Coordinator ์์ฒด๊ฐ ํ๋ฉด ์ ํ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์, ํ๋ฉด๋ผ๋ฆฌ์ ์ ํ ๋ก์ง์ด ํ์ํ ๊ฒ์ด ์๋๋ผ Coordinator์ ์ฐ๊ฒฐ๋์ด ํ๋ฉด ์ ํ์ ์์ฒญํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
์ฌ์ฉ
- Coordinator ํ๋กํ ์ฝ
protocol Coordinator {
var childCoordinators: [Coordinator] { get set }
var navigationController: UINavigationController { get set }
func start()
}
- childCoordinators : ํ์ Coordinator ๊ฐ ๋ค์ด๊ฐ ๋ฐฐ์ด
- navigationController : ์์ ViewController๋ค์ ๋ณด์ฌ์ค ์ญํ
- start() : ํด๋น Coordinator๊ฐ ๊ด๋ฆฌํ๋ ํ๋ฉด ํ์ํ๋ ๋ฉ์๋
- 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()
}
}
- 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()
}
}
- 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