数组每次迭代的RxSwift请求

数组每次迭代的RxSwift请求,swift,networking,rx-swift,Swift,Networking,Rx Swift,我使用RxSwift获取一些网络数据,但在执行数组每次迭代的请求时遇到问题。这是我的想法: 我有一个API端点,它返回一个不包含位置数据的OBJ数组。然后我将循环遍历Obj数组,并为每个对象获取带有Obj id的位置详细信息。如下所示: (代码简化) fetchObjLocationDetails()的格式如下: (代码简化) 扩展可观察类型,其中E==[Obj]?{ func fetchObjLocationDetails(使用networkClient networkClient:n

我使用RxSwift获取一些网络数据,但在执行数组每次迭代的请求时遇到问题。这是我的想法:

  • 我有一个API端点,它返回一个不包含位置数据的OBJ数组。然后我将循环遍历Obj数组,并为每个对象获取带有Obj id的位置详细信息。如下所示:
(代码简化)

  • fetchObjLocationDetails()的格式如下:
(代码简化)

扩展可观察类型,其中E==[Obj]?{
func fetchObjLocationDetails(使用networkClient networkClient:networkClient)->可观察{
返回平面图{Objs->在
guard让unwrappedObjs=Objs作为[Obj]?否则{返回Observable.just(nil)}
设disposeBag=disposeBag()
var populatedObjs=[Obj]()
展开dobjs.forEach{obj in
让getLocationDetailsEndpoint=WeDriveParkAPI.getLocation(id:String(obj.id))
networkClient.request(getLocationDetailsEndpoint)
.observeOn(MainScheduler.instance)
.subscribe(onNext:{json in
guard let populatedObj=Obj.fromJSON(json)作为Obj?else{return}
populatedObjs+=[populatedObj]
},onError:{e in
}).addDisposableTo(disposeBag)
}
返回Observable.just(populatedObjs)
}
}
}
这个解决方案实际上不起作用,因为代码甚至没有进入订阅下一个闭包


请记住,我对Swift和RxSwift编程都是新手,所以请温柔一点:)任何帮助都将不胜感激。

您可以使用内置操作符,而不是自定义操作符

networkClient.request(getObjsEndpoint)
.map({ (objs:[Obj]?) -> [Obj] in
    if let objs = objs {
        return objs
    } else {
        throw NSError(domain: "Objs is nil", code: 1, userInfo: nil)
    }
})
.flatMap({ (objs:[Obj]) -> Observable<[Obj]> in
    return objs.toObservable().flatMap({ (obj:Obj) -> Observable<Obj> in
        let getLocationDetailsEndpoint = WeDriveParkAPI.getLocation(id: String(obj.id))
        return self.networkClient.request(getLocationDetailsEndpoint)
        .map({ (obj:Obj?) -> Obj in
            if let obj = obj {
                return obj
            } else {
                throw NSError(domain: "Obj is nil", code: 1, userInfo: nil)
            }
        })
    }).toArray()
})
.subscribeNext({ (objs:[Obj]) in
    print("Populated objects:")
    print(objs)
}).addDisposableTo(bag)
networkClient.request(getObjsEndpoint)
.map({(objs:[Obj]?)->[Obj]in
如果让objs=objs{
返回对象
}否则{
抛出N错误(域:“Objs为nil”,代码:1,用户信息:nil)
}
})
.flatMap({(objs:[Obj])->在
返回objs.toObservable().flatMap({(obj:obj)->在
让getLocationDetailsEndpoint=WeDriveParkAPI.getLocation(id:String(obj.id))
返回self.networkClient.request(getLocationDetailsEndpoint)
.map({(obj:obj?->obj-in)
如果让obj=obj{
返回obj
}否则{
抛出N错误(域:“对象为零”,代码:1,用户信息:零)
}
})
}).toArray()
})
.subscribeNext({(objs:[Obj])位于
打印(“填充对象:”)
打印(objs)
}).addDisposableTo(袋子)
extension ObservableType where E == [Obj]? {
func fetchObjsLocationDetails(withNetworkClient networkClient: NetworkClient) -> Observable<[Obj]?> {
        return flatMap { Objs -> Observable<[Obj]?> in
            guard let unwrappedObjs = Objs as [Obj]? else { return Observable.just(nil) }

            let disposeBag = DisposeBag()
            var populatedObjs = [Obj]()

            unwrappedObjs.forEach { obj in
                let getLocationDetailsEndpoint = WeDriveParkAPI.getLocation(id: String(obj.id))

                networkClient.request(getLocationDetailsEndpoint)
                    .observeOn(MainScheduler.instance)
                    .subscribe(onNext: { json in
                        guard let populatedObj = Obj.fromJSON(json) as Obj? else { return }

                        populatedObjs += [populatedObj]
                        }, onError:{ e in

                    }).addDisposableTo(disposeBag)
            }
            return Observable.just(populatedObjs)
        }
    }
}
networkClient.request(getObjsEndpoint)
.map({ (objs:[Obj]?) -> [Obj] in
    if let objs = objs {
        return objs
    } else {
        throw NSError(domain: "Objs is nil", code: 1, userInfo: nil)
    }
})
.flatMap({ (objs:[Obj]) -> Observable<[Obj]> in
    return objs.toObservable().flatMap({ (obj:Obj) -> Observable<Obj> in
        let getLocationDetailsEndpoint = WeDriveParkAPI.getLocation(id: String(obj.id))
        return self.networkClient.request(getLocationDetailsEndpoint)
        .map({ (obj:Obj?) -> Obj in
            if let obj = obj {
                return obj
            } else {
                throw NSError(domain: "Obj is nil", code: 1, userInfo: nil)
            }
        })
    }).toArray()
})
.subscribeNext({ (objs:[Obj]) in
    print("Populated objects:")
    print(objs)
}).addDisposableTo(bag)