RxSwift실사용예시

작성일

개인프로젝트를 진행하던중, 처음으로 RxSwift를 적용한 코드

MainViewModel.siwft

lazy var headerYearLabel = BehaviorRelay(value: nowYearLabel)
lazy var headerMonthLabel = BehaviorRelay(value: nowMonthLabel)

스트림을 관찰할건데, 여기서 초기값은 현재의 년도와 현재의 달이다.

func bindUI() {
  mainViewModel.headerYearLabel
    .asDriver(onErrorJustReturn: "")
    .drive(mainView.headerYearLabel.rx.text)
    .disposed(by: disposeBag)
        
  mainViewModel.headerMonthLabel
    .asDriver(onErrorJustReturn: "")
    .drive(mainView.headerMonthLabel.rx.text)
    .disposed(by: disposeBag)
}

이런식으로하고 viewDidLoad에서 한번만 bindUI()를 실행하고
ViewModel에있는 headerYearLabel을 계속 관찰하고있다가,

mainViewModel.headerYearLabel.accept(currentYear)
mainViewModel.headerMonthLabel.accept(currentMonth)

이런식으로 accept메서드를 사용해서 값이 넘어오면,
위에 bindUI를 타게 되고, 타면

.asDriver(onErrorJustReturn: "")
.drive(mainView.headerYearLabel.rx.text)

이 두개의 슈거?를 타게된다. asDriver란, UI와 관련된 작업들을 메인쓰레드에서 하게해주는 것인데,
UI는 잠깐의 오류라도 있으면 안된다. 매초 수백수천번씩 그리기 때문인데
오류가나면 대신 빈 문자열이라도 보내줘서 크러쉬가 안나게하기 위함이다.
.drive는 subscript인데, asDriver와 같이 사용하는 것이다. 이러면 값이 바꿀때마다 accept를 통해 데이터가 스트림안으로 들어가고 그러면 그걸
headerYearLabel와 headerMonthLabel 이 두개가 반영해주는 것이다.