gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:43:20 25 4
gpt4 key购买 nike

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

最佳答案

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

关于swift - 等待多个可观察请求完成使用 RXSwift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55786232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com