繁体   English   中英

RxSwift 调用 bind 立即触发 vs subscribe(onNext:)

[英]RxSwift calling bind fires immediately vs subscribe(onNext: )

我读过的所有内容都说bind(to:)调用subscribe(onNext:) 所以我认为我应该能够换掉一些东西,但是当我使用`bind(to:) 时,它绑定到的东西会立即触发。 这是我的例子:

ButtonCollectionViewCell

class ButtonCollectionViewCell: UICollectionViewCell {

    lazy var buttonTapped: Observable<Void> = { _buttonTapped.asObservable() }()
    private var _buttonTapped = PublishSubject<Void>()
    private var disposeBag = DisposeBag()

    @IBOutlet private weak var textLabel: UILabel!
    @IBOutlet private weak var actionButton: UIButton!

    // MARK: - Lifecycle

    override func awakeFromNib() {
        super.awakeFromNib()

        actionButton.rx.tap.bind(to: _buttonTapped).disposed(by: disposeBag)
    }

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

}

现在,当我执行以下操作时,一切都按预期工作,当我点击按钮时,它会打印到控制台

带有集合视图的 ViewController

func createButtonCell() {
    let buttonCell = ButtonCollectionViewCell() // there's more code to create it, this is just for simplicity
    buttonCell.buttonTapped.subscribe { _ in
        print("tapped")
    }.disposed(by: disposeBag)
    return buttonCell
}

但是,如果我将上述更改为:

func createButtonCell() {
    let buttonCell = ButtonCollectionViewCell()
    buttonCell.buttonTapped.bind(to: buttonTapped)
    return buttonCell
}

private func buttonTapped(_ sender: Observable<Void>) {
    print("tapped")
}

"tapped"在我滚动时到达单元格之前打印出来,我假设是在创建它时。

我不明白这个。 我以为我几乎可以换掉实现? 我想在那里使用上面的第二个例子,因为我认为它更整洁,但不知道如何。

你的两个例子不一样......

在第一个示例中,您有: .subscribe { _ in print("tapped") }不是subscribe(onNext:)调用。 正在使用订阅的最后一个闭包,而不是第一个。 IE,您正在调用subscribe(onDisposed:)

此外,您的ButtonCollectionViewCell设置错误。 您在只调用一次的awakeFromNib()绑定,并在多次调用的prepareForReuse()进行处理。 两者之一需要移动到更合适的地方......

更新

您可以在重新安装 disposeBag 后重新绑定您的主题,或者您可以通过执行以下操作首先不将链条放入处理袋中:

_ = actionButton.rx.tap
    .takeUntil(rx.deallocating)
    .bind(to: _buttonTapped)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM