ArisRS
ArisRS

Reputation: 1394

Combine perform nested requests

I am new to Combine, please help. I need to combine 2 URL requests to receive complete data. First one with ids, and second request should use these ids in their request. I need it in one publisher. So I perform first:

func getDataFromServer(request: Request) -> AnyPublisher<MyData, NetworkError> {
    return networking.xml(request)
        .mapError { NetworkError.invalidData) }
        .flatMap { response -> AnyPublisher< MyData, NetworkError> in
            return Future< MyData, NetworkError>.init { promise in
                guard let data = MyData.from(response: response) else {
                    return promise(.failure(NetworkError.parseError))
                }
                if data.myID.count > 0 {
                    **// Perform second request with data.myID as parameter
                    // receive and fill additional fields data in 'data' object**
                }
                promise(.success(MyData))
            }.eraseToAnyPublisher()
        }
        .eraseToAnyPublisher()
}

Upvotes: 1

Views: 434

Answers (1)

SPatel
SPatel

Reputation: 4956

Remove Future just make other request which return AnyPublisher< MyData, NetworkError> or change that type as per your response type

func getDataFromServer(request: Request) -> AnyPublisher<MyData, NetworkError> {
    return networking.xml(request)
        .mapError { NetworkError.invalidData) }
        .flatMap { response -> AnyPublisher< MyData, NetworkError> in
            guard let data = MyData.from(response: response) else {
                return Fail(error: NetworkError.parseError).eraseToAnyPublisher()
            }
            
            if data.myID.count > 0 {
                // Perform second request with data.myID as parameter
                // receive and fill additional fields data in 'data' object
                return networking.makeYourRequest(with id: data.myID) // makeYourRequest method shoul return publisher with same type or possible to conver or change flatMap return type
            } else {
                return Just(data).eraseToAnyPublisher()
            }

        }
        .eraseToAnyPublisher()
}

Upvotes: 1

Related Questions