为什么当我使用 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.==
的实施不正确。它实际上并不检查是否相等,它只检查身份。删除该函数,让编译器为您生成正确的函数。
当我在 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.==
的实施不正确。它实际上并不检查是否相等,它只检查身份。删除该函数,让编译器为您生成正确的函数。