提问人:Gargo 提问时间:6/16/2023 最后编辑:Gargo 更新时间:6/16/2023 访问量:50
在 Swift 中使用 Combine 发出 2 个请求的序列?
Make a sequence of 2 requests with Combine in Swift?
问:
我有以下代码:
import Combine
func login() -> Future<Token, Error> { ... }
func updateImage() -> Future<Status, Never> { ... }
login()
.flatMap { response -> Future<Status, Error> in
// handle response and save token locally
return updateImage()
}
.sink(receiveCompletion: { error in
... //handleError
}, receiveValue: { response in
... // handle response and a different error
})
.store(in: ...)
我想加入并进入一个序列。但是,我发现这仅适用于并行请求。我需要一种方法来按顺序链接它们,我不确定 、 或 方法是否可以帮助我实现这一目标。我不仅需要转换,还需要处理每个函数的响应数据和错误。login()
updateImage()
zip
map
tryMap
mapError
如何解决这个问题?
答:
1赞
Sweeper
6/16/2023
#1
在 iOS 14+ 中,有一个新的 flatMap
重载,允许您将平面映射到失败的发布者,因此您只需要更改闭包的显式返回类型以匹配返回的类型:Never
updateImage
.flatMap { response -> Future<Status, Never> in // change "Error" to "Never"
在 iOS 14 之前,您需要使用:setFailureType(to:)
.flatMap { response -> Publishers.SetFailureType<Future<Status, Never>, Error> in
// ...
return updateImage().setFailureType(to: Error.self)
}
如果您不喜欢这么长的类型名称,请使用:AnyPublisher
.flatMap { response -> AnyPublisher<Status, Error> in
// ...
return updateImage().setFailureType(to: Error.self).eraseToAnyPublisher()
}
下一个:网络调用顺序 swift
评论
Futures
future.someHandler(...).someHandler2(...).someHandler3(...)...
flatMap
flatMap
过载。Never
flatMap
Never