等待多个可观察请求完成使用 RXSwift

Posted

技术标签:

【中文标题】等待多个可观察请求完成使用 RXSwift【英文标题】:Wait multiple observable requests to finish using RXSwift 【发布时间】:2019-04-21 19:54:24 【问题描述】:

我有一个可观察的列表,它们是从特定点请求谷歌距离和持续时间信息。我仅在获取所有这些信息时才尝试加载我的屏幕,但是我从未调用过那些可观察对象的下一个订阅(调用了“observer.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】:

根据您的订阅代码,您似乎没有保留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)
    

【讨论】:

以上是关于等待多个可观察请求完成使用 RXSwift的主要内容,如果未能解决你的问题,请参考以下文章

Angular等待所有订阅完成

在 foreach 中等待几个可观察的 rxjs 直到完成执行另一个

如何等待多个可观察流解决并一起返回它们

Angular 2+等待方法/可观察完成

等待多个 Alamofire 请求完成

请求完成时通知可观察对象完成