每 60 秒观察一次 observable 并与它在 RxSwift 中的先前值进行比较
Observe an observable every 60 second and compare to its previous value in RxSwift
我想做的是:
- 每 60 秒观察一次
location
可观察值,并比较与大约 60 秒前发出的事件相比距离是否超过阈值
发生了什么 [=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 }
}
}
我想做的是:
- 每 60 秒观察一次
location
可观察值,并比较与大约 60 秒前发出的事件相比距离是否超过阈值
发生了什么 [=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 }
}
}