RXSwift 在去抖时执行

RXSwift act while debounced

我想要一个 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)

我认为这个问题可能符合我的需求,但不确定它是否正是我所要求的:

据我了解这个问题,目标是在 debouncing/throttling 的时间范围内触发一些操作。

节流器(即每个时间段最多发射一次)相对简单:基本上使用 .window() 运算符,将所需的操作挂在上面,然后使用 .[ 的结果=17=]() 用于实际节流。

使用去抖动(即在给定时间范围内上游未发出后发出一次),这似乎很复杂但可能也是可行的。

实际上确实无论您是发出网络请求还是使用去抖动,因为网络请求将使用 flatMap 完成并且是一个独立的可观察对象。下面是一些示例代码,可以在网络请求进行时为 activity 指示器设置动画:

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,它维护启动和停止次数的计数,可用于监视多个网络请求。