【问题标题】:Call two Swift Combine calls where the second call depends on the result of the first call调用两个 Swift Combine 调用,其中第二个调用取决于第一个调用的结果
【发布时间】:2020-03-01 19:15:33
【问题描述】:

我是 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”类型的值转换为预期的参数类型位置

来自存储库的 fetch 调用签名如下所示

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

所以它是正确的,但是我在结果上使用的 .map 调用允许

$0.mapToModel() 

发生,所以我有 locationDto 对象,允许我转换到我的域模型。

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

【问题讨论】:

  • 您可能正在寻找flatMapswitchToLatest。但您可能还需要使用MergeMany
  • 有一个很好的主题,提供了许多解决像你这样的任务的方法Combine framework serialize async operations,它应该会有所帮助。当然我推荐我的方法:^),但这并不重要。

标签: ios swift combine


【解决方案1】:

尝试使用 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) }

【讨论】:

    猜你喜欢
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多