[RxSWIFT]UIのデータ型がDriver<>の場合?


なぜDriver<>?


まず、RxCocoaのTraitにはdriverと信号があります.
どちらの特性もUI層におけるレスポンスプログラミングに用いられる.
2つの共通点があります
  • エラーが返されていません
  • がプライマリスレッド上で
  • を実行することを確認します.
    したがって、driverまたはsignalを使用してUIデータを送信することが望ましい.

    DriverとSignalの違い


    :DriverとSignalを購読すると、次のことが起こります.
  • Driverは、購読時に最新値(b)を再生します.
  • 信号は再生されず、サブスクリプション後の値(c)のみが解放される.
  • 多くの場合、ドライバは再生されないため、よく使用されます.
    たとえば、ビューモデルとビューのバインドと最初のトリガのタイミングが異なる場合があります.
    トリガがバインド前に発生した場合、最初のイベントは発生しない可能性があります.
    ただし、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())
    }
    
  • Location Information ModelのDocuments To CellData()メソッドは、DocumnetDataをKocumnetタイプからDetailListCellDataタイプに変換します.
  • asDriver()を使用してPublish SubjectをDriverに変換します.
  • - 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)
    }
    
  • driverは、駆動方法を使用してイベントを処理する.
  • itemsはrxcocaがUItableViewに提供する独自の方法である.