I'm trying to implement pagination. Whenever the table view scrolls, I want the reactor to check if it reached the bottom. But binding reactor.action whenever tableView's didScroll happens seemed unnecessary.
So I thought it would be better to use an operator to limit binding the reactor.action. But I'm not sure which operator is more suitable between .debounce and .throttle in this case.
self.tableView.rx.didScroll
.skip(1)
.withLatestFrom(self.tableView.rx.contentOffset)
.map { [weak self] in
print("didScroll")
return Reactor.Action.pagination(
contentHeight: self?.tableView.contentSize.height ?? 0,
contentOffsetY: $0.y,
scrollViewHeight: UIScreen.main.bounds.height
)
}
.bind(to: reactor.action)
.disposed(by: disposeBag)
I've tried .debounce and .throttle in my code. But still I'm not sure which one is more suitable.
Personally, I always use the
reachedBottom(offset:)method supplied in RxSwiftExt.That said, on to the answer to the question...
The
debounceoperator is for when the input is jittery and you want to wait until it settles down to read off the input.The
throttleoperator is for when the input is constantly emitting and you want to slow the stream down to a manageable number.You can also use
throttlefor when the output will always be the same value (e.g.,()) and you want to react immediately. In this case, you want to make sure to setlatestto false.I'm assuming what you want here is to wait until the user stops scrolling and then check the
yof the contentOffset (and I expect you already know which to use based on the descriptions above.)Use
debouncein this case.