Coordinator pattern์ด ์ ๊ถ๊ธํด์ก๋๋ฉด ...
์ผ๋ง ์ ์ ํ์ฌ ์ฑ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ณผ์ ์์ ๊ธฐ์กด flow ๋ก์ง์ ์์ ํ๋ ์ผ์ด ์์๋ค.
๊ทธ๋ฌ๋ฉด์ ๋์ผํ view controller๊ฐ ์ด๋ค ์ํฉ์์๋ NavigationController์ child๋ก push ๋ ๋๋ ์๊ณ ์ด๋ค ์ํฉ์์๋ ๋จ์ผ ViewController๋ก present ๋๋ ์ํฉ์ด ์๊ธฐ๋ฉด์ ๋จ์ํ dismiss๋ก ์ฒ๋ฆฌํ๋ flow ๋ก์ง์ด ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌ๋ผ์ผํ๋ ์ํฉ๋ ์๊ฒจ๋ฒ๋ฆฌ๊ณ ๋ง์๋ค ....!
์ฌ์ง์ด ์ด๋ฌํ flow logic์ด view controller ๋ด๋ถ์ ์๋ฆฌ๋ฅผ ์ก๊ณ ์์ด์
1) view controller๊ฐ ๋ค์์ presentํด์ผํ๋ view controller๋ฅผ ์๊ณ ์๊ฒ ๋๊ฑฐ๋(์ฌ์ง์ด ์ํฉ์ ๋ฐ๋ผ ์ด๋ค view controller๋ฅผ ๋์์ผํ๋์ง ์ด๋ฌํ ๋ก์ง์ ๋ค ์๊ณ ์์ด์ผํ๋ค ...)
2) back button์ ํด๋ฆญํ๋ ๊ฒฝ์ฐ, navigation controller๊ฐ ์กด์ฌํ๋์ง ํ์ธ ํ pop / dismiss ์ค ๋ก์ง์ ์ ํํ๋ ๋ฑ
view controller๊ฐ ๋๋ฌด ๋ง์ ์ฑ
์์ ์ง๊ฒ ๋๋ ๋์์ ๋๋ฌด ๋ง์ ๊ฒ์ ์๊ฒ ๋๋ ํ์์ด ๋ฐ์ํ๋ค...๐ซ
๊ณ์ ์ด๋ฐ ์์ผ๋ก ๊ฐ๋ฐ์ ํ๋ค๊ฐ๋ ๋์ค์ ๋๋ฌด ๊ณจ์น ์ํ์ง๊ฒ ๋ปํด์(์ด๋ฏธ ๊ณจ์น์ํ...๐ซ ) ์ด๋ป๊ฒ ๊ฐ์ ํ ์ ์์๊น ๊ณ ๋ฏผํ๋ค๊ฐ Coordinator Pattern์ด ์๊ฐ๋ฌ๋ค. ์์ง ํ ๋ฒ๋ ์์จ๋ดค์ง๋ง ... ์๋ ์ ์์น ๊ณผ์ ์งํํ ๋ MVVM-C ํจํด ์ ์ฉํด์ ํ๋ก์ ํธ ํ๋ ๋๊ธฐ๋ค๋ ์๊ฐ๋๊ตฌ ...? ๋ฆฝ์ค ์ธ ๋๋ ๋ผ์ฐํฐ์์ ์ด๋ฐ ์ฒ๋ฆฌ๋ฅผ ๋ค ํด์ค์ ์ฐธ ํธํ๋๋ฐ...coordinator pattern์ด ๊ทธ ์ญํ ์ ํด์ค ๊ฒ ๊ฐ๊ณ ,, ์ด ๊ธฐํ์ ํ ๋ฒ ๊ณต๋ถํด๋ณด๋ฉด ์ข๊ฒ ๋ค ! ์ถ์ด์ ๊ณต๋ถ ์์... =33
(์ต์ข ์ ์ผ๋ก ํ์ฌ ์ฝ๋์ ์ ์ฉํ ์ ์์์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๊ทธ๋๋ ๊ณต๋ถํ๋ ๊ฒ์ ์์๋ฅผ ๋๊ณ ์...^_^)
Coordinator pattern์ ๋ํด ๊ฒ์ํ๋ค๋ณด๋ ๋ค๋ค 2015๋ ์ ์์ฑ๋ ์๋์ ๋ธ๋ก๊ทธ ๊ธ๋ก๋ถํฐ coordinator pattern์ด ํ์๋์๋คํ์ฌ ์๋ณธ๋ถํฐ ๋ฒ์ญํด๋ณด๊ธฐ๋ก =33
The Coordinator ๐
Big ViewController๋ค์ ๊ฐ์ฅ ํฐ ๋ฌธ์ ์ ์ค ํ๋๋ flow logic, view logic, business logic์ด ๋ชจ๋ ์ฎ์ฌ์๋ค๋ ๊ฒ์ด๋ค.
Tableview Cell์ ์ ํํ์ ๋ delegate ๋ก์ง์ ๋ณดํต ๋ค์๊ณผ ๊ฐ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฒ ๋๋ค.
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let object = self.dataSource.object(at: indexPath)
let detailViewController = SKDetailViewController(detailObject: object)
self.navigationController?.present(detailViewController, animated: true)
}
์ฌ๊ธฐ์๋ 3๊ฐ์ง ๋ก์ง์ด ๋ค์ด์๋ค.
1) get the object(dataSource๋ก๋ถํฐ ํ์ํ object ๊ฐ์ ธ์ค๊ธฐ)
2) create a view controller(์์์ ๊ฐ์ ธ์จ object๋ก view controller ์์ฑํ๊ธฐ)
3) present the view controller(ํด๋น view controller presentํ๊ธฐ)
๊ฐ๋จํ ์ฑ์์๋ ์ด๋ฌํ view controller๊ฐ ํ๋์ ์ํฉ์์ ํ๋ฒ๋ง ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ์์ผ๋ก ๊ตฌํ์ ํด๋ ๋ฌธ์ ์ ์ด ์๋ค. ํ์ง๋ง ์ฑ์ด ๋ณต์กํด์ง ์๋ก ๋์ผํ view controller๊ฐ ์ฌ์ฌ์ฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.
๋ง์ฝ ์์ ์ฝ๋์ ๊ฐ์ด flow logic์ด ๋ด๋ถ์ ์์ฑ๋ ๊ฒฝ์ฐ, view controller๋ ์ฌ์ฌ์ฉํ๊ธฐ๊ฐ ์ด๋ ค์์ง๋ค. ๊ทธ๋ฆฌ๊ณ view controller์ base class๋ UI๋ก ์์ํ๋ค๋ ์ฌ์ค์ ์์ง๋ง ๊ฒ….^^ view ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ user flow๊น์ง ์ปจํธ๋กคํ๋ ๊ฒ์ ๋ฒ์ ์ธ์ ์ผ์ด๋ผ๊ณ ์๊ฐํ๋ค.
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ด view controller๋ ๋ค์ flow๋ฅผ ์ํ ๊ฒ์ ์ด๋ป๊ฒ ๋ง๋ค์ด์ผํ๋์ง, ๊ทธ๊ฒ์ ์ด๋ป๊ฒ presentํ ๊ฒ์ธ์ง๋ฅผ ๋ค ์๊ณ ์๋ค. ๊ทธ๋ฆฌ๊ณ 3๋ฒ์งธ ์ค์ ๋ณด๋ฉด ๋ถ๋ชจ view controller์๊ฒ ~~~~์ ํ์ธ์! ๋ผ๊ณ ์ผ์ ์ํค๊ณ ์์ฃ ? ์์ ์ญ์์ด์ฃ ? ๊ทธ๋ฆฌ๊ณ ๋ ์ต์ ์ธ๊ฑด flow code๊ฐ ์ฌ๋ฌ view controller๊ณผ ์ฎ์ฌ์๋ค๋ ๊ฒ … (ํ์ฌ view controller, ๋ถ๋ชจ, presentํ๊ณ ์ ํ๋ view controller..)
๋ฐ๋ผ์ View Controller๋ค์ ๋ ์์ ๊ฐ๋ ์ ๊ฐ์ฒด๋ค๋ก ํ์ฌ๊ธ ์ ๋ฆฌํ๊ณ ๊ด๋ฆฌ๋๋ ๋ชจ์ต์ด ๋ง๋ค๊ณ ์๊ฐํ๋ค.
์ด๋ ๊ทธ ๊ฐ์ฒด๋ฅผ Coordinator๋ผ๊ณ ๋ถ๋ฅธ๋ค. (ํน์ Directors)
์ด๋ฌํ ๊ฐ๋ ์ ๊ตฌํ์ AppDelegate๊ฐ ์ต์๋จ์ Coordinator๋ผ๊ณ ๋ณผ ์ ์๋ AppCoordiantor๋ฅผ ๋ค๊ณ ์๊ณ ์ด๋ ๊ฐ Coordinator๋ค์ ์์ ์ child coordinator๋ค์ ๋ฐฐ์ด์ ๊ฐ๊ณ ์๋ ๋ชจ์ต์ผ๋ก ๋ณด์ฌ์ง๋ค. ๊ทธ๋ฆฌ๊ณ ํนํ ํญ๋ฐ์ฒ๋ผ ํ๋ ์ด์์ navigation controller๋ฅผ ๊ฐ๊ณ ์๋ ๊ฒฝ์ฐ์๋ ๊ฐ navigationController๊ฐ ์๊ธฐ ์์ ์ coordinator๋ฅผ ๊ฐ๊ฒ ๋๋ค. ๋ํ ๊ฐ์ , ์ฝํ ์ธ ์์ฑ๊ณผ ๊ฐ์ ํน์ ์์ ์ ์ํด ์ถ๊ฐ์ ์ผ๋ก child coordinator๋ ์์ฑํ ์ ์๋ค. (์ฌ๊ธฐ์ ๊ถ๊ธํด์ง ๊ฒ... Coordinator๋ฅผ ์์ฑํ๋ ๊ธฐ์ค์ ์ด๋ป๊ฒ ์ ํ๋ฉด ์ข์์ง...? ๐ค) ์ด๋ ๋ชจ๋ coordinator์ ์์ ์ parent coordinator๋ก๋ถํฐ ์์ฑ๋๋ค๋ ์ !!
Coordinator๋ PONSO๋ค. (Plain Old NSObjects๋ผ๊ณ ํ๋ค์)
PONSO๊ฐ ๋ญ๊ฐ ํ๋๋ Plain Old NSObjects์ ์ค์๋ง์ด๋ค.
Plain Old xxObjects๋ผ๋ ์ฉ์ด๊ฐ ์๋ ๊ฒ ๊ฐ์๋ฐ ๋ฏ์ค์ด์ ์ฐพ์๋ณด๋ ์ฃผ๋ก Java์์ ์ฌ์ฉ๋๋ ์ฉ์ด์ธ๋ฏํ๋ฐ ํน์ ๊ธฐ์ ์ ์์กดํ์ง ์๊ณ ๋ณธ๋ ์๋ฐ์ ์ฅ์ ์ ์ด๋ฆฌ๋ '์ค๋๋' ๋ฐฉ์์ '์์ํ' ์๋ฐ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ค. ๐ค
๊ทธ๋ผ PONSO ๋ํ NSObject์ ํน์ง์ ์ด๋ฆฌ๋ ๋จ์ํ๊ณ ๋ฒ์ฉ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋๊ฑฐ๊ฒ ์ง ... ?!
์๋ฅผ ๋ค์ด์ ์ธ์คํ๊ทธ๋จ์ photo creation ๊ณผ์ ์ ํ๋์ coordinator๋ก ์์ฑํ ์ ์์ ๊ฒ ๊ฐ๋ค.
์ฌ๊ธฐ์ child coordinator์ธ PhotoCreationCoordinator๋ฅผ ์์ฑํ ๋ rootViewController๋ฅผ ์ ๋ฌํ์ฌ flow๋ฅผ ์งํํ ์ ์๋๋ก ํ๊ณ ์๋ค.
// create a new photo selection viewcontroller & configure it
func beginPhotoCreationProcess() {
// ์ฌ๊ธฐ์ coordinator๋ก ํ์ฌ๊ธ photo selection view controller์ delegate๋ฅผ ์ฑํํ๊ฒํด์ ๋ค์ ์คํ
์ ๋ณด์ฌ์ค์ผํ๋ ์๊ฐ์ด ๋์ ๋ informed๋๊ฒํจ!
// ์ด ๊ณผ์ ์์ viewcontroller๋ค์ ์๋ก์ ๋ํด ์ ํ ์ ํ์๊ฐ ์์!! ๊ฐ view controller๋ ์ฌ์ด๋ค..๋ผ๊ณ ์๊ฐํ์ ใ
_ใ
let coordinator = PhotoCreationCoordinator(rootViewController: self.rootViewController, delegate: self)
self.childCoordinators.append(coordinator)
coordinator.beginPhotoCreationProcess()
}
func photoCreationCompletedSuccessfully(_ coordinator: PhotoCreationCoordinator) {
if let index = self.childCoordinators.firstIndex(where: { $0 === coordinator }) {
self.childCoordinators.remove(at: index)
}
}
func photoCreationCanceled(_ coordinator: PhotoCreationCoordinator) {
if let index = self.childCoordinators.firstIndex(where: { $0 === coordinator }) {
self.childCoordinators.remove(at: index)
}
}
๋น์ฆ๋์ค ๋ก์ง(ex. posting the photo)๋ coordinator ํน์ model๋ก ์ด๋์ํฌ ์ ์๋๋ฐ ์ด๋ ์ชฝ์ผ๋ก ์ด๋ํ๋ ๋ ๋ค view controller ์ธ๋ถ๋ก ๋น ์ ธ๋์ค๋๊ฑฐ๋ผ๊ณ ๋ณผ ์ ์๋ค. ์ฝ๋๋ค์ดํฐ๋ก ๋น์ฆ๋์ค ๋ก์ง์ ์ด๋์ํค๋๊ฑธ ์ถ์ฒํ๋๋ฐ ์๋๋ฉด ์ฝ๋๋ค์ดํฐ๊ฐ ์ด๋ฏธ ์ฝ๋์ ๋ค๋ฅธ ๋ถ๋ถ ์ฌ์ด์ ์ ์ฐฉ์ ์ญํ ์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ ๊ฒ flow layout์ ๋ถ๋ฆฌ์ํค๋ ๊ฒ์ ์ฌ๋ฌ ์ฅ์ ์ ๊ฐ์ง๊ณ ์๋๋ฐ ...
view controller๋ model์ view์ ๋ฐ์ธ๋ฉ์ํค๋ ์ญํ ์ ์ง์คํ ์ ์๋ค. ๋ํ ์ฝ๊ฒ ์ฌ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ ๋ค์ํ ์ํฉ์์ ๋ณต์กํ ์กฐ๊ฑด๋ฌธ ์์ด ์ฌ์ฉ๋ ์ ์๋ค.
View controller์ ์ด๊ธฐํ ๋ํ ๋ถ๋ฆฌ๋ ์ ์๋ค. Initializing์ ์๊ฐ๋ณด๋ค ๋ณต์กํ ์์ ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๊ฐ๊ณผํด์๋ ์๋๋ค.
์ ํ์ view controller๋ก ํ์ฌ๊ธ iOS ์ธ๊ณ์ ์ค์ฌ์ด ๋๊ธธ ์ํ์ง๋ง ๊ทธ๋ฌํ ๋ชจ์ต์ ์ฑ์ ํ์ฅ ๊ฐ๋ฅ์ฑ์ ์ง์ํ๋ค๊ณ ๋ณด๊ธฐ ์ด๋ ต๋ค .. ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ Coordinator๋ ์ฝ๋๋ฅผ ์ฝ๊ฒ ๊ต์ฒดํ ์ ์๋ ๋จ์๋ก ๋ถ๋ฆฌํ ์ ์๋ ์ข์ ๋ฐฉ๋ฒ์ด๋ค.
๋ด๊ฐ ์ฒ์์ ํ์ํ๋ค๊ณ ์๊ฐํ๋ ๋ฐฐ๊ฒฝ๊ณผ coordinator pattern์ ๋ชฉ์ ์ด ๋ถํฉํ๋ ๋ฏ ํ์ฌ ์กฐ๊ธ ๋ ์์๋ด์ผํ ๊ฒ ๊ฐ๋ค!
๊ฐ๋ ์ ์ธ ๋ด์ฉ์ ์ดํด์...๐ซก
๋ค์ ๊ธ์์ ์กฐ๊ธ ๋ ๊ตฌํ๊ณผ ๊ฐ๊น์ด ์ด์ผ๊ธฐ๋ฅผ ํ๊ณ ์๋ค๊ณ ํ๋ ์ถํ์ ๋ ์์ธํ ์์๋ด์ผ๊ฒ๋ฐ
'๐ iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Property Wrapper ๋ฝ๊ฐ๊ธฐ (1) (0) | 2024.01.12 |
---|---|
[Swift] defer๋ฅผ ์ด๋ป๊ฒ ์จ์ผ ์ ์ผ๋ค๊ณ ์๋ฌธ์ด ๋ ๊น (3) | 2024.01.05 |
[Swift] rethrows ํค์๋๋ ์ธ์ ์ฐ๋๊ฑธ๊น ๐ค (3) | 2024.01.02 |
[Coordinator] Coordinators Redux (4) | 2023.12.29 |