gpt4 book ai didi

ios - 在 RxSwift 的 for 循环中调用多个 API 请求的最佳方式

转载 作者:可可西里 更新时间:2023-11-01 01:57:31 25 4
gpt4 key购买 nike

我必须使用 for 循环进行几次 api 调用(大约 100 次),完成后我需要完成 Observable。我正在使用它如下:

func getMaterialInfo(materialNo:[String]) -> Observable<[String: Material]>{
return Observable.create({ (observable) -> Disposable in
for (index,mat) in materialNo.enumerated(){
// Pass the material number one by one to get the Material object
self.getMaterialInfo(materialNo: mat).subscribe(onNext: { material in
var materialDict: [String: Material] = [:]
materialDict[material.materialNumber] = material
observable.onNext(materialDict)
if index == (materialNo.count-1){
observable.onCompleted()
}
}, onError: { (error) in
observable.onError(error)
}, onCompleted: {
}).disposed(by: self.disposeBag)
}
return Disposables.create()
})
}

虽然循环工作正常并且调用了 observable.onCompleted() 但调用方方法没有收到它。我这样调用它:

private func getImage(materialNo:[String]){
if materialNo.isEmpty {
return
}
var dictMaterials = [String:String]()
materialService.getMaterialInfo(materialNo: materialNo).subscribe(onNext: { (materials) in
for (key,value) in materials{
if (value.imageUrl != nil){
dictMaterials[key] = value.imageUrl
}
}
}, onError: { (error) in

}, onCompleted: {
self.view?.updateToolImage(toolImageList: dictMaterials)
}, onDisposed: {}).disposed(by: disposeBag)
}

Rx 的 OnCompleted block 未执行。我该如何解决?

最佳答案

编辑(3 月 5 日)

我重新审视了这个答案,因为我不确定在编写下面的代码示例时我的大脑在做什么。我会做这样的事情:

func getMaterialInfo(materialNo: String) -> Observable<[String: Material]> {
// ...
}

func getMaterialInfo(materialNumbers:[String]) -> Observable<[String: Material]>{
let allObservables = materialNumbers
.map { getMaterialInfo(materialNo: $0) }

return Observable.merge(allObservables)
}

原始答案

根据您的代码,我认为所有单独的 getMaterialInfo 调用都是同时完成的。基于此,我将重写您的 getMaterialInfo(:[_]) 方法以使用 .merge运营商。

func getMaterialInfo(materialNo:[String]) -> Observable<[String: Material]>{
return Observable.create({ (observable) -> Disposable in
// a collection of observables that we haven't yet subscribed to
let allObservables = materialNo
.map { getMaterialInfo(materialNo: $0) }

return Observable.merge(allObservables)
}
return Disposables.create()
}

请注意,使用 merge 会同时订阅所有可观察对象,同时触发 100 个网络请求。对于顺序订阅,请使用 concat相反!

关于ios - 在 RxSwift 的 for 循环中调用多个 API 请求的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50659174/

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