我希望有一个Observable,在进行反跳操作时(在我们仍未发出值的时间范围内),还会发生其他事情,例如显示微调器。
所以在我的代码示例中,仅在发出值之后引用我的视图。
observable.debounce(0.3, scheduler: MainScheduler.instance).do(onNext: { spinner in
spinner.stop() //here I set it to stop, I want to run spinner.start() while we are in the debounce area
}).subscribe().disposedBy(disposeBag)
我认为这个问题可能符合我的需求,但不确定是否正是我所要求的: RxSwift - Debounce/Throttle "inverse"
答案 0 :(得分:1)
据我了解的问题,目标是在反跳/节流的时间范围内触发一些动作。
进行节流相对简单(即每个时间段最多发射一次):基本上使用.window()运算符,将所需的动作挂在其上,然后将.window()的结果用于实际节流。
使用反跳(即在给定时间范围内在上游之后没有发射一次),这似乎很复杂,但也可能可行。
答案 1 :(得分:1)
实际上是很重要的,无论您是发出网络请求还是使用防抖动,因为网络请求都将使用flatMap来完成,并且是一个独立的观察对象。以下是一些示例代码,它们将在网络请求进行期间为活动指示器设置动画:
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
@IBOutlet weak var activityIndicator: UIActivityIndicatorView!
override func viewDidLoad() {
super.viewDidLoad()
let _activityIndicator = activityIndicator! // to avoid dealing with self.
button.rx.tap
.flatMapLatest { () -> Observable<Int> in
let request = Observable<Int>.timer(5.0, scheduler: MainScheduler.instance)
return Observable.using({ ActivityIndicatorAnimator(_activityIndicator) }, observableFactory: { _ in request })
}
.subscribe()
.disposed(by: bag)
}
let bag = DisposeBag()
}
class ActivityIndicatorAnimator: Disposable {
init(_ spinner: UIActivityIndicatorView) {
self.spinner = spinner
spinner.startAnimating()
}
func dispose() {
spinner.stopAnimating()
}
let spinner: UIActivityIndicatorView
}
以上内容使用计时器来模拟网络请求。 using
运算符将在可观察对象启动时创建资源,并在可观察对象完成时处置资源。 ActivityIndicatorAnimator
资源在创建资源时启动动画,在处理资源时停止动画。
RxSwift存储库有一个名为ActivityIndicator
的更复杂的示例,该示例维护启动和停止的次数,并可以用来监视多个网络请求。