Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[iOS] Coordinator 패턴을 적용한 구조 구현 #135

Merged
merged 10 commits into from
Nov 30, 2023

Conversation

yoondj98
Copy link
Collaborator

❗ 배경

작업 배경에 대한 설명을 작성합니다.
Issue에 대한 링크를 첨부합니다.

Coordinator 패턴을 적용하였습니다.
전체적인 구조는 App Coordinator를 통해 모든 작업을 관리를 합니다.

🔧 작업 내역

작업한 내용들을 나열합니다.
간결하게 리스트 업하고, 자세한 설명은 아래 리뷰 노트에서 합니다.

  • Coordinator 패턴 구조 구현

🧪 테스트 방법

동작을 테스트할 수 있는 방법을 설명합니다.
앱 실행 방법일 수 있고, 유닛 테스트 실행 방법일 수 있습니다.

현재는 임시적인 두 화면과 UI가 없는 View Controller들로 이루어진 채 구현을 진행했습니다.
각 ViewController는 디렉토리명에서 알 수 있듯이 temp이며 각 패키지를 import해와서 구현해주시면 됩니다.

📝 리뷰 노트

작업 내역에 대한 자세한 설명을 작성합니다.

Coordinator의 구조는 다음과 같습니다.

  • App Coordinator
    • HomMapCoordinator
      • HomeMapViewController
    • SpotCoordinator
      • SpotViewController
    • SearchMusicCoordinator
      • SearchMusicViewController
    • SaveJourneyCoordinator
      • SaveJourneyViewController
    • SettingCoordinator
      • SettingViewController
    • RewindCoordinator
      • RewindViewController

모든 동작의 총괄은 App Coordinator를 통해서 진행됩니다.

고민 거리

어떤 Coordinator Level에서 관리를 해야 하는가?

App Coordinator를 통하지 않고 한 단계 안의 Coordinator 단계에서(ex.HomeMapCoordinator) 이동을 진행하려고 했으나 App Coordinator에서 childCoordinators를 관리하고 있고 새로운 Coordinator를 생성, 삭제한 후 ViewController를 만들어 이동시키는 동작이 있기에 App Coordinator가 관리를 할 수 있도록 구현하였습니다.

parentCoordinator의 필요성

기존에는 parentCoordinator와 childCoordinators를 두어 포함관계를 가졌으나 의존성이 깊어지다보니 delegate를 통해 그 결합도를 낮춰보았습니다. 그 과정에서 parent Coordinator는 사라지게 되었습니다.

그럼 childCoordinators 필요성은?

childCoordinators의 필요성에 의문이 생겼는데 이것은 coordinator가 할당 해제되는 이슈를 막기 위해 존재해야 한다고 합니다.

📸 스크린샷

작업한 내용에 대한 스크린샷, 영상 등을 첨부합니다.

해당 스크린샷은 임시적인 두 화면 간의 이동을 나타내는 영상입니다.

@yoondj98 yoondj98 added the ✨ 신규 기능 신규 기능 개발 label Nov 29, 2023
@yoondj98 yoondj98 added this to the 🧱 코드 기반 다지기 milestone Nov 29, 2023
@yoondj98 yoondj98 self-assigned this Nov 29, 2023
@yoondj98 yoondj98 changed the base branch from main to iOS/release November 29, 2023 14:28
Copy link
Member

@SwiftyJunnos SwiftyJunnos left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다 👍👍

모든 책임이 AppCoordinator에게 위임되는 것이 조금 과하지는 않나? 싶은 생각이 드네요.
내일 만나서 이야기해보면 좋을 것 같습니다 😊

Comment on lines 10 to 16
final class AppCoordinator: Coordinator,
HomeMapCoordinatorDelegate,
SpotCoordinatorDelegate,
RewindCoordinatorDelegate,
SettingCoordinatorDelegate,
SearchMusicCoordinatorDelegate,
SaveJourneyCoordinatorDelegate {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Delegate는 extension으로 빼고 MARK로 구분시켜 주세요..!

Comment on lines 55 to 66
func navigateToSetting(coordinator: HomeMapCoordinator) {
let settingCoordinator = SettingCoordinator(navigationController: navigationController)
settingCoordinator.delegate = self

self.childCoordinators.append(settingCoordinator)
settingCoordinator.start()
}

func navigateToHomeMap(coordinator: SpotCoordinator) {
removeChildCoordinator(child: coordinator)
navigationController.popViewController(animated: true)
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

push랑 pop이 구분 없이 navigate라서 뭐가 뭔지 헷갈리는 것 같기도 합니다.

push, pop, present에 따라서 메서드 이름을 구분짓는건 어떨까요?

Comment on lines 96 to 98
while navigationController.topViewController !== homeMapViewController {
navigationController.popViewController(animated: true)
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

while문은 좀 위험해보이는데 다른 방법은 없을까요?
물론 위의 로직 덕분에 루프가 도는 일은 없겠지만 그래도 뭔가 꺼림직하네요.

ViewController 스택에서 homeMapViewController를 찾고,
만약에 있다면 그보다 위에 쌓인 ViewController들을 pop하고
없다면 setViewController를 호출하는 건 어떨까요?

Comment on lines 89 to 94
guard let homeMapViewController = navigationController.viewControllers.first(where: {
$0 is HomeMapViewController
}) else {
navigationController.setViewControllers([HomeMapViewController()], animated: true)
return
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 메서드 자체를 프로토콜에서 기본 구현같은 걸로 빼두면 편리할 것 같습니다!

@SwiftyJunnos SwiftyJunnos linked an issue Nov 29, 2023 that may be closed by this pull request
2 tasks
Base automatically changed from iOS/release to iOS/epic/JourneyListScene November 30, 2023 04:00
@SwiftyJunnos SwiftyJunnos changed the base branch from iOS/epic/JourneyListScene to iOS/epic/MSCoordinator November 30, 2023 04:44
Copy link
Member

@SwiftyJunnos SwiftyJunnos left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다.
실제로 적용해보면서 발전시켜나가봐요 👍👍

Copy link
Member

@PushedGun PushedGun left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다!

@SwiftyJunnos SwiftyJunnos merged commit efbc172 into iOS/epic/MSCoordinator Nov 30, 2023
27 checks passed
@SwiftyJunnos SwiftyJunnos deleted the iOS/task/MSCoordinator branch November 30, 2023 11:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
✨ 신규 기능 신규 기능 개발
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Coordinator 구현
3 participants