Вызов двух звонков Swift Combine, когда второй звонок зависит от результата первого звонка - PullRequest
0 голосов
/ 01 марта 2020

Я новичок в Swift Combine, поэтому у меня возникла небольшая проблема

Я пытаюсь вызвать два вызова API и объединить результаты, так как второй вызов API зависит от результата первого вызова.

Вот код

return self.gameRepository.fetchGames(forUser: user.id)
            .map { games -> AnyPublisher<[Game], ApiError> in
                let result = games.map { gameDto -> Game in
                    let location = self.venueRepository.fetch(by: gameDto.siteId)
                        .map { $0.mapToModel() }
                    let game = gameDto.mapToModel(location: location)
                    return game
                }

Моя ошибка находится в строке 4 "let location", компилятор жалуется, когда я пытаюсь передать это в строку 5

game.mapToModel(location: location)

Не могу преобразовать значение типа 'AnyPublisher' в ожидаемый тип аргумента. Местоположение

Сигнатура вызова выборки из репозитория выглядит следующим образом

func fetch(by id: String) -> AnyPublisher<LocationDto, ApiError>

Так что это правильно, но вызов .map, который я использую на результат позволяет

$0.mapToModel() 

произойти, поэтому у меня есть объект locationDto, который позволяет мне привести к моей модели Домена.

Любая помощь в том, как я могу вызвать эти два apis вместе, будет высоко ценится.

1 Ответ

0 голосов
/ 02 марта 2020

Вместо первого оператора карты, попробуйте использовать flatMap и возвратитесь из этого .flatmap AnyPublisher с вашей моделью, которую необходимо передать другому запросу. Псевдокод:

fetchGames -> AnyPublisher<[Game]> // First request
fetchGame(by id: String) -> AnyPublisher<LocationDto> // Second request that depends on model from first one

fetchGames.flatMap { fetchGame(by: $0.id) }
...