1つの UIButton に対して2回サブスクライブしています:
- クリックごとに UI を更新するための最初のサブスクリプション
- 2 番目のサブスクリプション。クリックの累積後、1 秒ごとに Web サービスの値を更新します。
コード:
class ProductionSize {
var id : Int?
var size: Int = 0
var name: String = ""
}
class ProductionCell: UICollectionViewCell {
var rxBag = DisposeBag()
// this will be set in the (cellForItemAt indexPath: IndexPath) of collection view
var productionSize: ProductionSize? {
didSet {
showProductionSize()
prepareButton()
}
}
func showProductionSize() {
// ... code for showing ProductionSize in labels
}
func prepareButton() {
// This for subscribing for every click for displaying purpose
btn_increase.rx.tap
.subscribe(){event in
self.increaseClicked()
}
.addDisposableTo(rxBag)
// this for subscribing for sending webservice request after 1 second of clicking the button (so that if user click it quickly i send only last request)
btn_increase.rx.tap
.debounce(1.0, scheduler: MainScheduler.instance)
.subscribe(){ event in self.updateOnWS() }
.addDisposableTo(rxBag)
}
func increaseClicked() {
productionSize.size = productionSize.size + 1
showProductionSize()
}
func updateOnWS() {
// code for updating on webservice with Moya, RxSwift and Alamofire§
}
// when scrolling it gets called to dispose subscribtions
override func prepareForReuse() {
rxBag = DisposeBag()
}
}
問題:
で破棄が発生するためprepareForReuse()
、ボタンを何度もクリックしてすぐにスクロールすると、Web サービス呼び出しが破棄され、更新されません。
私が試したこと:
addDisposableTo(vc?.rx_disposableBag)
親の ViewController DisposableBag に追加されました。問題は、購読が蓄積され、クリックするたびに
updateWS()
何度も呼び出され、スクロールごとに購読され、破棄されることはありません。からdisposableBagの再初期化を削除しようとしました
prepareForReuse()
。問題は、ボタンへのサブスクリプションが重複して蓄積され、クリックするたびに多くの Web サービス呼び出しが呼び出されることです。
質問:debounce
サブスクリプションを最後まで呼び出し、複数のサブスクリプションで繰り返されないように
するにはどうすればよいですか ( addDisposableTo
viewController バッグの場合) ?