【发布时间】:2021-09-30 08:51:48
【问题描述】:
我在函数中压缩了两个发布者,通过后端 API 下载用户和车辆:
func fetchUserAndvehicles() {
Publishers.Zip(UserApiClient().getUser(), VehicleApiClient().getVehicles())
.eraseToAnyPublisher()
.receive(on: DispatchQueue.main)
.sink(receiveCompletion: { [weak self] completion in
switch completion {
case .failure(let error):
self?.errorHandling.showErrorAlert(error)
case .finished:
break
}
}, receiveValue: { [weak self] user, vehicles in
// store vehicles in the user object
})
.store(in: &subscriptions)
}
每辆车都有一个imageUrl,可用于下载车辆的图像。这工作正常。但是我想在将车辆存储在用户对象中之前下载图像(如果有的话)。是否可以使用相同的组合管道来执行此操作?我尝试使用flatMap,但导致编译错误。
以下内容来自 Cristik 的出色回答。看起来没问题,但是 Xcode 用 No exact matches in call to instance method 'flatMap' 标记了 flatMap 行:
let vehiclesPublisher = VehicleApiClient().getVehicles()
.flatMap { vehicles in
Publishers.Zip(Just(vehicles).setFailureType(to: Error.self), Publishers.MergeMany(vehicles.map { VehicleApiClient().getImage(at: $0.url)}).collect())
}
.map {
return $0.0
}
车辆有一个可选属性需要解包,但这不是编译错误的原因。
【问题讨论】:
-
假设您设法拥有一个开始下载所有图像的可编译代码,但是如果其中一些失败了怎么办?是否仍要分配给用户?另外,您的程序上的图片下载情况如何,您有发布商吗?
-
如果车辆的图片下载失败,我仍然想将车辆分配给用户。我有一个图片下载的发布者。