呼叫两个Swift Combine呼叫,第二个呼叫取决于第一个呼叫的结果

时间:2020-03-01 19:15:33

标签: ios swift combine

我是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行“让位置”上,当我尝试将此传递给 第5行

game.mapToModel(location: location)

无法将“ AnyPublisher”类型的值转换为预期的参数类型“位置”

从存储库中获取呼叫签名如下:

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

这是正确的,但是我在结果中使用的.map调用允许

$0.mapToModel() 

发生,所以我有locationDto对象,可以将其强制转换为Domain模型。

任何有关如何将这两个api一起调用的帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

而不是第一个地图运算符,请尝试使用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) }