Ios 在RxSwift的for循环中调用多个API请求的最佳方法
我必须使用for循环进行几个api调用(大约100次),完成后,我需要完成Observable。我使用它的方式如下:Ios 在RxSwift的for循环中调用多个API请求的最佳方法,ios,swift,rx-swift,Ios,Swift,Rx Swift,我必须使用for循环进行几个api调用(大约100次),完成后,我需要完成Observable。我使用它的方式如下: func getMaterialInfo(materialNo:[String]) -> Observable<[String: Material]>{ return Observable.create({ (observable) -> Disposable in for (index,mat) in materialNo.enu
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()
})
}
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)
}
未执行接收的未完成块。如何修复它?编辑(3月5日)
我重新审视了这个答案,因为我不确定我在写下面的代码示例时大脑在做什么。我会这样做:
func-getMaterialInfo(材料编号:字符串)->可观察{
// ...
}
func getMaterialInfo(材料编号:[字符串])->可观察{
设allObservables=材料编号
.map{getMaterialInfo(材料编号:$0)}
返回可观察。合并(allObservables)
}
原始答案
根据您的代码,我认为所有的getMaterialInfo
调用都是同时完成的。基于此,我将重写您的getMaterialInfo(:[\u])
方法以使用运算符
func getMaterialInfo(材料编号:[字符串])->可观察{
返回可观察的。在中创建({(可观察)->一次性
//一组我们尚未订阅的观测值
设allObservables=材料编号
.map{getMaterialInfo(材料编号:$0)}
返回可观察。合并(allObservables)
}
返回一次性物品。创建()
}
请注意,使用merge
可同时订阅所有可观察到的内容,同时触发100个网络请求。对于顺序订阅,请使用