[RxSWIFT]UIのデータ型がDriver<>の場合?
なぜDriver<>?
まず、RxCocoaのTraitにはdriverと信号があります.
どちらの特性もUI層におけるレスポンスプログラミングに用いられる.
2つの共通点があります
したがって、driverまたはsignalを使用してUIデータを送信することが望ましい.
DriverとSignalの違い
:DriverとSignalを購読すると、次のことが起こります.
たとえば、ビューモデルとビューのバインドと最初のトリガのタイミングが異なる場合があります.
トリガがバインド前に発生した場合、最初のイベントは発生しない可能性があります.
ただし、driverを使用する場合は、これらのエラーを心配する必要はありません.(最新値が再生されるため)
n/a.結論
Driverは最新の値を再生するので、バインドとトリガの時間差で見逃したfirstトリガを心配する必要はありません.
したがって、データを見逃したくない場合は、SignalではなくDriverを使用することをお勧めします.
リファレンス-RxCocoa 4の「メディア」信号と中継
ドライバとしてデータをTable Viewに提供する例
まず、構造は次のとおりです.
LocalInformationView Controlは、DetailListというUItable View()を有しています.
- ViewModel - > View
LocalInformationViewModel->LocalInformationViewControlとして
DetailListのデータを提供する必要があるからです.
LocalInfractionView Modelには、DetailListCellDataがあります.
このDetailListCellDataのタイプはDriver<[DetailListCellData]です.
- LocationInformationViewModel.swift
let detailListCellData : Driver<[DetailListCellData]>
let documentData = PublishSubject<[KLDocument]>()
init(model: LocationInfromationModel = LocationInfromationModel()) {
// 다른 코드 생략
detailListCellData = documentData
.map(model.documentsToCellData(_:))
.asDriver(onErrorDriveWith: .empty())
}
- LocationInformationViewController.swift
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)
}
Reference
この問題について([RxSWIFT]UIのデータ型がDriver<>の場合?), 我々は、より多くの情報をここで見つけました https://velog.io/@sun02/RxSwift-UI의-data타입을-Driver로-하는-이유テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol