먼저 RxCocoa가 가지는 Trait에는 driver와 signal이 있습니다.
두 가지 trait 모두 UI층에서 reactive programming을 위해 사용됩니다.
따라서 이와 같은 두 가지 특징을 공통적으로 가집니다.
그렇기에 UI의 데이터를 뿌려주기 위해서는 driver 또는 signal를 사용하는게 좋습니다.
: Driver와 Signal을 구독한 순간 replay는 다음과 같이 발생합니다.
대부분 replay가 되지 않는 것이 문제가 되는 경우가 많기 때문에 Driver가 더 많이 사용되곤 합니다.
예를 들어, viewModel과 View의 바인딩과 첫번째 trigger의 타이밍이 다른 경우가 있습니다.
trigger가 바인딩 전에 발생한다면 첫번째 이벤트가 발생하지 않을 수 있습니다.
그러나 driver를 사용한다면 이러한 버그를 신경쓰지 않아도 됩니다. (최신 값을 replay하기 때문에)
Driver는 최신값을 replay하기 때문에 바인딩과 trigger의 타이밍 차이로 놓칠 수도 있는 first trigger를 놓칠 우려가 없습니다.
따라서 데이터를 놓치고 싶지 않을 때 Signal보다 Driver를 사용하는 것이 좋습니다.
참고자료- [Medium] Signal and Relay in RxCocoa 4
먼저 구조는 다음과 같습니다.
LocalInformationViewController가 detailList라는 UITableView()를 가집니다.
LocalInformationViewModel -> LocalInformationViewController로
detailList의 데이터를 전달해주어야하기 때문에
LocalInfromationViewModel이 detailListCellData를 가집니다.
이 detailListCellData의 타입은 Driver<[DetailListCellData]> 입니다.
let detailListCellData : Driver<[DetailListCellData]>
let documentData = PublishSubject<[KLDocument]>()
init(model: LocationInfromationModel = LocationInfromationModel()) {
// 다른 코드 생략
detailListCellData = documentData
.map(model.documentsToCellData(_:))
.asDriver(onErrorDriveWith: .empty())
}
let detailList = UITableView()
func bind(_ viewModel: LocalInformationViewModel) {
viewModel.detailListCellData
.drive(detailList.rx.items) { tableView, row, data in
let cell = tableView.dequeueReusableCell(withIdentifier: "DetailListCell", for: IndexPath(row: row, section: 0)) as! DetailListCell
cell.setData(data)
return cell
}
.disposed(by: disposebag)
}