Подождите несколько наблюдаемых запросов, чтобы завершить использование RXSwift - PullRequest
1 голос
/ 21 апреля 2019

У меня есть список наблюдаемых, которые являются запросами информации о расстоянии и продолжительности Google от определенной точки. Я пытаюсь загрузить свой экран только тогда, когда вся эта информация извлечена, но моя подписка на следующую для этих наблюдаемых никогда не вызывается (вызывается строка "наблюдатель.onNext (viewModel)", и информация уже извлечена, только подписка (onNext) не вызывается). Как я могу ждать, пока эти наблюдаемые завершены?

func stationInfoObservable(userLocation: CLLocationCoordinate2D, stations: [Station]) -> [Observable<GasStationTableCellViewModel>] {

    var observables: [Observable<GasStationTableCellViewModel>] = []

    for station in stations {
        observables.append(Observable.create({ observer in
            guard let toCoordinate = station.coordinate() else { return Disposables.create() }

            self.mapDirections.routes(from: userLocation.asPlace(), to: toCoordinate.asPlace()) { routes, error in
                if let error = error {
                    logger.error(error)
                } else {
                    guard let leg = routes.first?.legs?.first else {
                        return
                    }

                    guard let distance = leg.distance?.text, let duration = leg.duration?.text else { return }
                    station.distanceInKMFromUserLocation = distance
                    station.distanceInMinutesFromUserLocation = duration

                    let viewModel = GasStationTableCellViewModel(station: station)

                    observer.onNext(viewModel)
                    observer.onCompleted()
                }
            }
            return Disposables.create()
        }))
    }

    return observables
}

Я пытаюсь подписаться таким образом (РЕДАКТИРОВАТЬ: я сейчас пытаюсь использовать zip, но диск / подписка продолжает не вызываться):

Observable.zip(observables)
            .asDriver(onErrorJustReturn: [])
            .drive(onNext: { test in
                print(test)
            }, onCompleted: {
                print("aa")
            }).disposed(by: DisposeBag())

1 Ответ

1 голос
/ 22 апреля 2019

Судя по вашему коду подписки, вы не сохраняете DisposeBag.Вы должны сохранить этот объект, потому что когда он освобождается, все имеющиеся в его распоряжении предметы сразу же удаляются.Попробуйте сделать это свойство и использовать свойство:

class MyClass {
    let disposeBag = DisposeBag()

    func setupSubscription() {
        Observable.zip(observables)
            .asDriver(onErrorJustReturn: [])
            .drive(onNext: { test in
                print(test)
            }, onCompleted: {
                print("aa")
            }).disposed(by: disposeBag)
    }
}
...