为什么当我使用 RxTableViewSectionedAnimatedDataSource 时 UITableViewCell 没有绑定到 cellWiewModel?

Why UITableViewCell does not bind to cellWiewModel when I use RxTableViewSectionedAnimatedDataSource?

当我在 RxSwift 中使用 MVVM 模式时,UITableViewCell 出现了一些奇怪的问题。我无法描述,但我会尽力解释。

假设我们有简单的 UITableViewCell

class MyTableViewCell: UITableViewCell {
  var disposeBag = DisposeBag()

  override func prepareForReuse() {
    super.prepareForReuse()
    disposeBag = DisposeBag()
  }

func bind(to viewModel: MyCellViewModel) {
    viewModel.randomValue.asDriver()
      .drive(onNext: { [weak self] value in
        guard let self = self else { return}
        print(value) // WHEN TWO CELLS I GET NEW VALUES JUST IN ONE OF THEM
      })
      .disposed(by: disposeBag)
    
}

使用带简单计时器的 ViewModel。

class MyCellViewModel: NSObject {
  let randomValue = PublishSubject<Int>()
  init() {

 Observable<Int>.timer(.seconds(1), period: .seconds(1), scheduler: SerialDispatchQueueScheduler(qos: .userInteractive))
        .map { _ in Int.random()}
        .do(onNext: {
          print([=11=]) // WORK PERFECT FOR BOTH
        })
        .bind(to: randomValue)
        .disposed(by: rx.disposeBag)
 }

}

我也使用 RxDataSources 来填充我的 tableView。

   private func makeDataSource() -> RxTableViewSectionedAnimatedDataSource<Section> {
        RxTableViewSectionedAnimatedDataSource<Section>(configureCell: { _, tableView, indexPath, item in
          switch item {
          case let .myItem(cellViewModel):
            let cell = tableView.dequeueReusableCell(with: MyTableViewCell.self, for: indexPath)
            cell.bind(to: cellViewModel)
            return cell
          }
        })
      }

问题是,当我有两个单元格时,我在其中一个单元格中获得了新值,而在另一个单元格中却没有

注意方法bind(to viewModel

但是当我把RxTableViewSectionedAnimatedDataSource改成RxTableViewSectionedReloadDataSource时一切正常。

如何让它与 RxTableViewSectionedAnimatedDataSource 一起工作?我明白它们之间的区别,但在这种情况下,我不知道这有什么影响?

我还检查了内存图,只看到了两个单元格实例和两个 cellViewModels 实例。所以我希望没有泄漏。

感谢您的帮助!

ItemMode.== 的实施不正确。它实际上并不检查是否相等,它只检查身份。删除该函数,让编译器为您生成正确的函数。