在 rxswift 中循环

问题描述 投票:0回答:1

嘿,我想在 rxswift 中循环,所以我的代码流程首先是使用此代码获取数据 id 列表

func fetchAllGamesWithPagination(_ page: Int) -> Observable<[ListGame]> {
        let url = URLBASE + "/games"
        let parameters = [
            "key": API_KEY,
            "page_size": "10",
            "page": String(page)
        ]
        
        return Observable<[ListGame]>.create { observer in
            AF.request(url, parameters: parameters)
                .responseDecodable(of: GameModel.self) { respons in
                    switch respons.result {
                    case .success(let result):
                        observer.onNext(result.results ?? [])
                        observer.onCompleted()
                    case .failure(let err):
                        observer.onError(err)
                    }
                }
            return Disposables.create()
        }
    }

ListGame 有 id,在获取列表游戏后,我使用该 id 来获取详细信息 id

 func fetchGameDetails(_ id: Int) -> Observable<GameDetailModel> {
        let url = URLBASE + "/games/\(id)"
        let parameters = [
            "key": API_KEY
        ]
        
        return Observable<GameDetailModel>.create { observer in
            AF.request(url, parameters: parameters)
                .responseDecodable(of: GameDetailModel.self) { response in
                    switch response.result {
                    case .success(let detail):
                        observer.onNext(detail)
                        observer.onCompleted()
                    case .failure(let err):
                        observer.onError(err)
                    }
                }
            return Disposables.create()
        }
    }

是否可以使用 rxswift 首先获取 ListGame,然后循环获取整个数据详细信息?

uikit rx-swift
1个回答
0
投票

您可以使用

flatMap
zip
来实现您的目标:

func fetchData()  -> Observable<[GameDetailModel]> {
    fetchAllGamesWithPagination(0)
        .flatMap { list in
            Observable.zip(list.map {
                self.fetchGameDetails($0.id)
            })
        }
}
© www.soinside.com 2019 - 2024. All rights reserved.