如何使用RxSwift管理绑定到TableViewCell的树状数据模型

时间:2018-12-11 17:25:35

标签: ios swift mvvm swift4 rxdatasources

我有如下数据模型, View structure

[Car Brand] has [Types] has Year or specific model (string)

例如

BMW > Z4 > 2005
BMW > Z3 > 1999
BMW > Z3 > 2001
Porshe > Carrera > 1999
Audi > TT > 2002

选择后必须更改yearView backgroundColor。我在yearView中添加了tapGesture,然后尝试从Type Cell中监听所有yearViews

var carForType = PublishSubject<SelectedCar>() // in class property
let bv = yearContainer(frame: .zero, withOption: option)
bv.tap.rx.event.asObservable().map({ _ -> Selected in
    return SelectedBet.init(car: nil, type: self.type, year: option)
})
    .bind(to: self.typeForCar)
    .disposed(by: self.disposeBag)

然后我想从TableVC中获取所有选定的汽车

cell.selectedCars.debug().subscribe(onNext: {
    var car = $0
    pBet.brand = self.viewModel.brand
    print(car)
}).disposed(by: self.disposeBag)

但是在滚动之后,它双重订阅了单元格,总的来说,我开始认为应该有一种更好的方法。希望就如何简化提出意见,我愿意更改所有结构。

注意:项目正在使用MVVM和RxDataSources扩展。

1 个答案:

答案 0 :(得分:0)

感谢RxSwift社区,我设法找到了相同的用例。如kzaher的here所述,单元所使用的disposeBags需要在单元的prepareForReuse方法中重新分配。

但是我使用了另一种不需要在单元格中放置disposeBag的方法。我将所有tapEvents添加到单元格中的一个数组,然后将其合并为一个可观察到的数组,然后在tableView中通过将所有单元格可观察到的数组合并为一个对象,当然在合并之前,我将tapObservables映射到了包含有关所有汽车信息的模型中细节。它变成了一种责任链模式[2]

Merge and map explanation

这是进一步详细信息的代码。

在VC中完成所有订阅。

dataSource = RxTableViewSectionedReloadDataSource<MarketsSectionData>(configureCell: { (dataSource, tableView, indexPath, _) in
    guard let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseId, for: indexPath) as? AllCarsCell else {
        return UITableViewCell()
    }

    let market = dataSource.sectionModels[indexPath.section].items[indexPath.row]
    cell.setUpWith(market: market)
    let sel = cell.selectionsForMarket?.map({ car -> SelectedCar in
        var tCar = car
        tCar.brand = self.viewModel.brand
        return tCar
    })
    self.selectionCells.onNext(sel!)
    cell.findSelectedCellAndFill(withId: self.viewModel.currentCar?.id)
    self.viewModel.selection.subscribe(onNext: { car in
        cell.findSelectedCellAndFill(withId: car.option?.id)
    }, onDisposed: {
        print("deque is disposed")
    }).disposed(by: self.disposeBag)

    return cell
})

self.selectionCells.merge().bind(to: self.viewModel.selection).disposed(by: self.disposeBag)

在该单元格中,我将所有视图都连接成一个可观察到的视图

self.selectionsForMarket = Observable.from(tapActions).merge()

视图是无状态的,只有tapGesture。