防弹跳时的RXSwift动作

时间:2018-10-10 11:37:29

标签: rx-swift debouncing

我希望有一个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"

2 个答案:

答案 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的更复杂的示例,该示例维护启动和停止的次数,并可以用来监视多个网络请求。