То, что вы запрашиваете, это испускание значения, когда устройство движется с определенной скоростью, которая является значением, которое фактически предоставляется в объекте местоположения. Просто используйте его.
extension CLLocationManager {
func goingFast(threshold: CLLocationSpeed) -> Observable<CLLocation> {
return rx.didUpdateLocations
.compactMap { $0.last }
.filter { $0.speed > threshold }
}
}
С учетом вышеизложенного, если вы хотите узнать, превысило ли устройство скорость 10 м / с в любой момент за последние 60 секунд, вы должны использовать 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 { $0.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 { $0.1 }
.compactMap { $0.0 }
}
}