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 이 두개가 반영해주는 것이다.