코디네이터를 책임과 역할에 따라 분리하기
위 구조와 같이 Buy Coordinator를 만들어 Buy 용도에 맞는 화면들을 전환할 수 있다.
이렇게 용도별로 코디네이터를 분리하면 메인 코디네이터의 역할 부담이 줄어들고, 화면 전환 로직을 찾을 때 좀 더 빠르게 찾을 수 있지 않을까라는 장점이 있을 것 같다(주관적인 생각)
Parent Coordinator와 Child Coordinator 이해하기
만약 여러 개의 코디네이터를 사용할 경우 다음과 같은 구조가 완성될 것이다.
이때 상위에 있는 parent coodinator와 하위에 있는 child coordinator의 관계를 맺어줘야 한다.
1단계:
이전에 우리는 Parent coodinator에 해당되는 MainCoordinator를 만들었었다.
이제 child coordinator에 해당되는 Buy Coodinator를 만들어보자.
BuyCoordinator.swift
class BuyCoordinator: Coordinator {
// 나머지 구현부 생략
func start() {
// 1
let vc = BuyViewController.instantiate()
vc.coordinator = self
navigationController.pushViewController(vc, animated: true)
}
}
여기서 1을 보면 MainCoordinator에 존재하던 buySubscription()의 코드를 BuyCoordinator에 옮긴 것을 확인 할 수 있다.
2단계:
BuyViewController에서는 BuyCoordinator를 사용할 것이기 때문에 coordinator의 변수 타입을 BuyCoordinator로 지정한다.
BuyViewController.swift
class BuyViewController: UIViewController, Storyboarded {
weak var coordinator: BuyCoordinator?
override func viewDidLoad() {
super.viewDidLoad()
}
}
3단계:
BuyCoordinator에서는 ParentCoordinator에 해당되는 MainCoordinator를 선언해준다.
BuyCoordinator.swift
class BuyCoordinator: Coordinator {
weak var parentCoordinator: MainCoordinator?
}
*weak으로 선언한 이유
MainCoordinator에서는 ChildCoodinator인 BuyCoordinator를 참조하고, BuyCoordinator에서도 MainCoordinator를 참조한다.
이럴 경우 순환 참조로 인한 메모리 누수가 발생하므로 weak을 활용해 순환 참조를 방지한다.
4단계:
이전에 MainCoordinator에서는 버튼을 누르면 직접 BuyViewController객체를 활용해 화면을 띄웠었다.
그러나 이제 버튼을 눌렀을 때 BuyViewController 대신 BuyCoordinator를 통해 화면을 띄우도록 한다.
MainCoordinator.swift
class MainCoordinator: NSObject, Coordinator {
var childCoordinators = [Coordinator]()
func buySubscription() {
// BuyCoordinator 타입의 인스턴스 생성
let child = BuyCoordinator(navigationController: navigationController)
// BuyCoordinator의 parent coordinator로 self 지정
child.parentCoordinator = self
// BuyCoordinator을 자신의 child coordinator로 추가
childCoordinators.append(child)
// BuyViewController로 전환
child.start()
}
// 나머지 구현부 생략
}
Child Coordinator의 일이 종료되었을 경우
위에서 MainCoordinator에는 childCoordinators.append(child)를 통해 child coodinator들을 append한다.
만약, BuyViewController에서 되돌아가기 버튼을 눌러 ViewController에 돌아갔음에도 childCoordinators 배열에서 BuyCoodinator를 삭제하지 않는다면 메모리 낭비가 발생하게 될 것이다.
이걸 방지하기 위해서는 parent coodinator에서 child coordinator를 지줘야 한다.
해당 방법은 https://lena-chamna.netlify.app/post/ios_design_pattern_coordinator_advanced/ 참고
참고링크:
https://lena-chamna.netlify.app/post/ios_design_pattern_coordinator_advanced/
'아직정리안한것들모음집' 카테고리의 다른 글
[Coordinator] 내용 정리 1 (0) | 2023.07.13 |
---|