Объедините два потока с flatMapLatest - PullRequest
0 голосов
/ 26 сентября 2018

возникли проблемы с объединением в наблюдаемые в flatMapLatest

Логика : при каждом событии следующего действия я хочу объединить его со следующим событием getCurrentLocation, которое происходит после ActivityEventбыл запущен, объедините их в кортеж и затем что-то с ним сделайте.

В настоящее время это выглядит так:

ActivitiesController
    .start()
    .flatMapLatest { activity in 
        LocationController.shared.getCurrentLocation().map { ($0, activity) }
    }
    .subscribe(onNext: { (activity, currentLocation in
        print("")
    })
    .disposed(by: disposeBag)

Код местоположения:

func getCurrentLocation() -> Observable<CLLocation> {
    self.requestLocationUseAuthorizationIfNotDetermined(for: .always)
    self.locationManager.requestLocation()
    return self.publishSubject.take(1) // take next object from the publish subject (only one)
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    guard let location = locations.last, location.horizontalAccuracy > 0 else {
        return
    }
    self.publishSubject.onNext(location)
}

Так какмы знаем, что requestLocation() запускает didUpdateLocations, мы думали, что логика должна работать, но она не

в результате locationManager не всегда обновляет и возвращает старые значения вместо новых

Doребята, у вас есть идеи?

1 Ответ

0 голосов
/ 26 сентября 2018

Вам нужно использовать withLatestFrom вместо flatMapLatest.

LocationController.shared.getCurrentLocation().withLatestFrom(activityEvent) {
    // in here $0 will refer to the current location that was just emitted and
    // $1 will refer to the last activityEvent that was emitted.
    return ($0, $1)
}
...