Я подписываюсь 2 раза на 1 UIButton:
- Первая подписка для обновления пользовательского интерфейса при каждом клике
- Вторая подписка для обновления значений в веб-сервисе каждую секунду после накопления кликов.
Код:
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()
, если я нажимаю кнопку много раз и сразу же прокручиваю, вызовы веб-службы удаляются и не обновляются.
что я пробовал:
Добавлено
addDisposableTo(vc?.rx_disposableBag)
в родительский ViewController DisposableBag.Проблема, подписки накапливаются, и при каждом нажатии много раз вызывается
updateWS()
, который подписывается при каждой прокрутке и никогда не удаляется.Я попытался удалить повторную инициализацию disposableBag из
prepareForReuse()
.Проблема. Снова подписки на кнопки дублируются и накапливаются, а многие вызовы веб-сервисов вызываются при каждом нажатии.
Вопрос: Как я могу получить debounce
подписки, вызываемые до конца и никогда не повторяющиеся с несколькими подписками (в случае addDisposableTo
viewController Bag)?
productionSize
в вашемupdateOnWS
? Таким образом, пользователь может нажимать кнопку много раз, а затем, когда он перестает нажимать, номер (т.е. нажатый 5 раз) 5 используется для сетевого вызова? И каким должно быть поведение, когда вы прокручиваете вниз и удаляете ячейку; должен ли сетевой запрос быть утилизирован или он все еще должен выполняться? И должен ли пользовательский интерфейс производственного размера обновляться при касании пользователя или при успешном ответе на сетевой запрос? - person dsapalo   schedule 04.04.2017self
внутри замыканий, это может привести к утечкам памяти, которые складываются, особенно когда они находятся вUITableViewCell
s илиUICollectionViewCell
s. Это предотвращает удаление объекта. См. stackoverflow.com/questions/40583685/ - person dsapalo   schedule 04.04.2017