【问题标题】:RXSwift act while debouncedRXSwift 在去抖动时采取行动
【发布时间】:2019-03-15 07:32:54
【问题描述】:

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

【问题讨论】:

    标签: rx-swift debouncing


    【解决方案1】:

    据我了解的问题,目标是在去抖动/节流的时间范围内触发一些操作。

    节流相对简单(即每个时间帧最多发射一次):基本上使用 .window() 运算符,将所需的操作挂在其上,然后使用 .window() 的结果进行实际节流。

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

    【讨论】:

    • 嗯,它可能会发生很多次......这是一个服务器请求,如果它正在执行,我希望隐藏视图
    • 所以你基本上想在每个请求正在进行时隐藏视图并在响应到达后再次显示它?去抖动如何适应这一切,你是否并行触发请求?
    • 嗯这是一个通用问题,隐藏视图只是一个示例。对于服务器请求的示例,它可能会在去抖动时显示微调器..
    • 用例仍不清楚,尤其是去抖动部分。只是一个疯狂的猜测,rxmarbles.com/#sample 是否适用于您的情况?
    • 用例不相关。我想知道我是否能做到。但我一定会查看你的链接并更新:)谢谢
    【解决方案2】:

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

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

    【讨论】:

    • 这很漂亮。我从中学到了很多。我不认为它直接回答了这个问题,但它确实提供了有关如何使用不同方法来解决同一问题的见解。标记为收藏
    猜你喜欢
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    相关资源
    最近更新 更多