uikitrx-swift

Looping in rxswift


hey i wanted to loop in rxswift, so my code flow first is fetching list of data id with this code

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()
        }
    }

in ListGame theres id, after getting list game i used that id to get detail id with

 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()
        }
    }

is it possible using rxswift for fetching ListGame first and then looping for getting entire data detail?


Solution

  • You can use flatMap and zip to acheive your goal:

    func fetchData()  -> Observable<[GameDetailModel]> {
        fetchAllGamesWithPagination(0)
            .flatMap { list in
                Observable.zip(list.map {
                    self.fetchGameDetails($0.id)
                })
            }
    }