【发布时间】:2017-09-11 20:35:13
【问题描述】:
与反应式和非反应式 iOS 项目的情况一样,如果您有一个 UI 元素(例如,一个按钮或正在选择的表格视图单元格)将视图控制器推送到导航堆栈上,如果有由于某种原因(尤其是在旧设备上)滞后,重复点击可能会导致重复推送,从而导致糟糕的用户体验。
通常您可以在第一次点击后禁用该元素。
例如:
@IBAction func myButtonTap() {
button.isEnabled = false
doTheRestOfTheAction()
}
我对 RxSwift 比较陌生。我正在尝试找出一种适当的反应式方法来实现它,以修复我的应用程序中的一些错误,这些错误会导致视图被重复推送。
一些想法:
可以使用debounce 或throttle,但看起来像创可贴,不一定能解决所有情况。
我目前认为最好的方法是在预期事件发生后处置订阅。
let disposable = tableView.rx.itemSelected
.subscribe(onNext: { [weak self] indexPath in
self?.performSegue(withIdentifier: "MySegueIdentifier", sender: self)
})
...
func prepareForSegue() {
myDisposable.dispose()
finishPrepareForSegue()
}
虽然如果你想在 subscribe 块内取消订阅,编译器会抱怨在它自己的初始值中使用了一个变量,这是有道理的。我想有解决方法,但我想知道,有没有更好的方法?也许我缺少一个反应式操作员?
尝试搜索类似的示例,但结果有限。
谢谢
编辑:也许是takeUntil 运营商?
【问题讨论】:
标签: ios uitableview rx-swift reactive rx-cocoa