RxSwift 调用绑定立即触发与订阅(在下一个: )



我读到的所有内容都说bind(to:)在其中调用subscribe(onNext:)。所以我认为我应该能够交换一些东西,但是当我使用'bind(to:(时,它立即绑定到火灾的东西。这是我的例子:

按钮集合视图单元格

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()
}
}

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

具有集合视图的视图控制器

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:)调用。正在使用订阅的最后一个关闭,而不是第一个。即,您正在呼叫subscribe(onDisposed:).

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

更新

您可以在重新拔插 disposeBag 后重新绑定您的主题,或者您首先可以通过以下方式不将链条放入处置袋中:

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

最新更新