[RxSwift] AirPortClone: Coordinator

Junyoung Park·2022년 12월 23일
0

RxSwift

목록 보기
14/25
post-thumbnail

#2 Beginning MVVM Coordinator - RxSwift MVVM Coordinator iOS App

AirPortClone: Coordinator

구현 목표

  • Coordinator 패턴 사용
  • 뷰 모델 빌더를 통한 뷰 모델과 Coordinator 연결

구현 태스크

  • 앱, 뷰, 뷰 모델 Coordinator 프로토콜 상속

핵심 코드

import Foundation

protocol Coordinator: AnyObject {
    var childCoordinator: [Coordinator] { get set }
    
    func start()
}

extension Coordinator {
    func add(coordinator: Coordinator) {
        childCoordinator.append(coordinator)
    }
    func remove(coordinator: Coordinator) {
        childCoordinator = childCoordinator.filter({ $0 !== coordinator })
    }
}
  • 모든 Coordinator가 기본으로 상속하는 프로토콜
  • 자기 자신의 배열을 변수로 가지는 childCoordinator는 일종의 싱글턴 패턴 역할
  • start를 통해 Coordinator의 기능이 동작
import Foundation

class BaseCoordinator: Coordinator {
    var childCoordinator: [Coordinator] = []
    
    func start() {
        fatalError("Children should be implemented in start func")
    }
}
  • BaseCoordinatorchildCoordinator는 동작하지 않지만 이를 상속하는 다른 Coordinator가 오버라이드해서 사용
import UIKit

class SearchCoordinator: BaseCoordinator {
    private let navigationController: UINavigationController
    
    init(navigationController: UINavigationController) {
        self.navigationController = navigationController
    }
    
    override func start() {
        let searchVC = SearchViewController()
        searchVC.viewModelBuilder = {
            SearchViewModel(input: $0)
        }
        navigationController.pushViewController(searchVC, animated: true)
    }
}
  • 검색 뷰 모델을 주관하는 SearchCoordinator에서는 네비게이션 컨트롤러를 신 딜리게이트로부터 건네받아 뷰 컨트롤러를 푸쉬
  • 뷰 컨트롤러가 사용할 뷰 모델을 현 시점에서 클로저로 구성
    typealias ViewModelBuilder = (SearchViewPresentable.Input) -> SearchViewPresentable
  • SearchViewPresentable은 곧 뷰 모델이 상속하는 프로토콜
  • 뷰 모델 자체를 private으로 감춰주기 위해 해당 인자를 var로 노출, 인풋을 주고 해당 SearchViewPresentable을 건네 받음
    private func setViewModel() {
        viewModel = viewModelBuilder((
            searchText: searchBarController.searchBar.rx.text.orEmpty.asDriver(), ()
        ))
    }
  • 뷰 컨트롤러의 viewDidLoad 함수 단에서 실행
  • 뷰 모델을 해당 viewModelBuilder 클로저를 통해 옵셔널에서 실제 값을 가진 뷰 모델로 전환하는 코드
  • 뷰 컨트롤러가 가지고 있는 서치 바의 현재 텍스트 드라이버를 넘겨주기

Driver가 곧 UI를 그릴 때 사용하기 적합한 Rx 구동자임에 주의하자! Coordinator 패턴에서 네비게이션 컨트롤러까지 넘겨받는 것은 상당히 놀랍다.

profile
JUST DO IT

0개의 댓글