【发布时间】:2017-04-04 12:09:49
【问题描述】:
我为 1 个 UIButton 订阅了 2 次:
- 首次订阅,每次点击都会更新 UI
- 二次订阅,累计点击后每1秒更新一次Web Service上的值。
代码:
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(),如果我多次单击按钮并立即滚动,webservice 调用将被处理而不更新。
我尝试过的:
-
在父 ViewController DisposableBag 中添加了
addDisposableTo(vc?.rx_disposableBag)。问题,订阅累积,每次点击
updateWS()都会被调用很多次,每次滚动都订阅了,从未被释放。 -
我已尝试从
prepareForReuse()中删除disposableBag 重新初始化。问题,再次重复和累积按钮的订阅,并且每次点击都会调用许多 Web 服务调用。
问题:
我怎样才能让debounce 订阅被调用到最后并且从不重复多个订阅(如果是addDisposableTo viewController Bag)?
【问题讨论】:
-
不确定您的情况,所以请澄清一下:您的
updateOnWS中是否使用了productionSize?这样用户可以多次点击按钮,然后当他们停止点击时,数字(即点击5次)5用于网络呼叫?当您向下滚动并处置单元格时,行为应该是什么?网络请求应该被处理还是应该仍然执行?生产尺寸 UI 应该在用户点击时更新,还是在网络请求成功响应时更新? -
另外,请注意在闭包中使用
self的方式,这可能会导致内存泄漏,尤其是在UITableViewCells 或UICollectionViewCells 中时。它可以防止对象被丢弃。见stackoverflow.com/questions/40583685/… -
@iwillnot 我不会在每次点击时更新 productionSize,以便在 web 服务调用时,我将获取最后一个 productionSize 值并将其发送到 updateOnWS 中。如果点击 5 次,它只会在网络上更新 1 次。我不等待响应,为了更好的用户体验,我会显示 ui 更新它们,如果请求成功完成,我会更新它
-
向下滚动并处理单元格时的行为应该是什么;网络请求应该被处理还是应该仍然执行?
-
@iwillnot 该请求应该被执行
标签: ios swift3 reactive-programming rx-swift rx-cocoa