【发布时间】: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 一起调用的帮助将不胜感激。
【问题讨论】:
-
您可能正在寻找
flatMap或switchToLatest。但您可能还需要使用MergeMany。 -
有一个很好的主题,提供了许多解决像你这样的任务的方法Combine framework serialize async operations,它应该会有所帮助。当然我推荐我的方法:^),但这并不重要。