每 60 秒观察一次 observable 并与它在 RxSwift 中的先前值进行比较

Observe an observable every 60 second and compare to its previous value in RxSwift

我想做的是:

发生了什么 [=12=] 我总是收到第一个发出的事件,它不是每 60 秒更新一次。不过 $1 有最新发出的事件。

代码如下:

Observable<Int>.timer(.seconds(0), period: .seconds(60), scheduler: MainScheduler.instance)
            .withLatestFrom(location)
            .distinctUntilChanged { [=10=].distance(from: ).magnitude < 10.0 }
            .subscribe(onNext: { (location) in
                print(location)
            })
            .disposed(by: disposeBag)

您要求的是在设备超过特定速度时发出一个值,该值是位置对象中实际提供的值。随便用。

extension CLLocationManager {
    func goingFast(threshold: CLLocationSpeed) -> Observable<CLLocation> {
        return rx.didUpdateLocations
            .compactMap { [=10=].last }
            .filter { [=10=].speed > threshold }
    }
}

有了上面的内容,如果您想知道设备在过去 60 秒内的任何时候是否超过 10 m/s,您可以使用 Alexander 在评论中提到的 sample :

let manager = CLLocationManager()
let fast = manager.goingFast(threshold: 0.167)
    .sample(Observable<Int>.interval(.seconds(60), scheduler: MainScheduler.instance))

也就是说,作为跟踪幅度增加的一般情况,您需要使用 scan 运算符。

extension CLLocationManager {
    func example(period: RxTimeInterval, threshold: Double, scheduler: SchedulerType) -> Observable<CLLocation> {
        return rx.didUpdateLocations
            .compactMap { [=12=].last }
            .sample(Observable<Int>.interval(period, scheduler: scheduler))
            .scan((CLLocation?.none, false)) { last, current in
                if (last.0?.distance(from: current).magnitude ?? 0) < threshold {
                    return (current, false)
                }
                else {
                    return (current, true)
                }
            }
            .filter { [=12=].1 }
            .compactMap { [=12=].0 }
    }
}