【问题标题】:How to manage tree like data models bound to TableViewCell with RxSwift如何使用 RxSwift 管理绑定到 TableViewCell 的树状数据模型
【发布时间】:2018-12-11 17:25:35
【问题描述】:

我有一个如下所示的数据模型,

[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 背景颜色。我在 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 扩展。

【问题讨论】:

    标签: ios swift mvvm swift4 rxdatasources


    【解决方案1】:

    感谢 RxSwift 社区,我设法找到了相同的用例。正如来自 kzaher 的here 解释的那样,cell 使用的 disposeBags 需要在 cell 的 prepareForReuse 方法中被释放。

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

    这里是更多细节的代码。

    在 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多