Ios 在RxSwift的for循环中调用多个API请求的最佳方法

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

我必须使用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()
    })
}
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个网络请求。对于顺序订阅,请使用