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