观察者在单元格 RxSwift 中处理后仍然接收事件

Posted

技术标签:

【中文标题】观察者在单元格 RxSwift 中处理后仍然接收事件【英文标题】:Observer still receiving events after being disposed in cell RxSwift 【发布时间】:2017-08-29 10:11:40 【问题描述】:

我在集合视图和表格视图中使用 RxSwift 进行表单处理。我遇到了一个问题。

我有一个单一的选择列表组件,我每次都在创建DisposeBag,同时配置删除所有以前的订阅者。两者都调用了onDisposed 方法,但我仍然收到重复的onNext 事件。这在开始时效果很好,但是当我重新加载集合视图或表格视图时,我遇到了这个问题。请让我知道是我做错了什么还是库中的这个错误。

var selectedIndex = Variable<Int?>(nil)

func configureRx(sender: RxRow<Int>) 

    dateVarDisposable = DisposeBag()

    selectedIndex
        .asObservable()
        .subscribe(onNext: [weak self] (index) in
            self?.selectRow(selectedIndex: index)
            , onDisposed: 

                print("")
        )
        .addDisposableTo(disposableBag)

    sender.dataVariable.asObservable()
        .debug(self.stringTag, trimOutput: false)
        .subscribe(onNext:  (sender) in
            self.selectedIndex.value = sender
        , onDisposed: 
    )
        .addDisposableTo(disposableBag)        

【问题讨论】:

你在哪里调用configureRx方法?我猜你需要dispose订阅prepareForReuse方法... configureRx 正在 cellForRow 上被调用,是的,我已经尝试在 prepareForReuse 上使用 dispose 可能是因为 .addDisposableTo() 方法已被弃用,取而代之的是 .disposed(by: disposeBag) 【参考方案1】:

检查这个:https://github.com/ReactiveX/RxSwift/issues/821。单元格有一个特殊类别 - reuseBag

【讨论】:

以上是关于观察者在单元格 RxSwift 中处理后仍然接收事件的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift MVVM 表视图/集合视图,用户输入单元表示状态

RxSwift + UITableViewCell 如何在 heightForRowAt 中获取单元格对象

使用 RxSwift 异步加载 UITableView 单元格

在 ViewController 中可观察到的单元测试 RxSwift

如何动画从表格视图(rxswift)中删除单元格?

如何在 RxSwift 中为整个应用程序中的单元格和按钮设置动画?