我有这样一个准则:
Task {
async let configsReq = self.interactor.getConfigs()
async let optionsReq = self.interactor.getOptions()
async let updateStateReq = self.interactor.getAppUpdateState()
async let contactsReq = self.interactor.getContactOptions()
var config: Config?
var options: AvailableOptions?
var updateState: UpdateType?
var contacts: ContactOptions?
do {
config = try await configsReq
} catch {
config = nil
}
do {
options = try await optionsReq
} catch {
options = nil
}
do {
updateState = try await updateStateReq
} catch {
updateState = nil
}
do {
contacts = try await contactsReq
} catch {
contacts = nil
}
self.goToNextPage()
}
在这种情况下,请求得到正确的响应或抛出错误对我来说并不重要。我不想阻止用户得到正确的响应。而且我还想确保我所有的请求都得到了响应(正确或错误响应),以便将用户带到下一页
我怎样才能用新的swift并发更好更干净地写这些代码?我试过了(但是我不能得到每个相关请求的匹配错误):
Task {
async let configs = self.interactor.getConfigs()
async let options = self.interactor.getOptions()
async let updateState = self.interactor.getAppUpdateState()
async let contacts = self.interactor.getContactOptions()
do {
let array = try await [configs, options, updateState, contacts]
} catch {
print(error)
}
}
2条答案
按热度按时间lnlaulya1#
我将创建一个小助手,帮助将错误封装到
Result
中:如果出现错误,您甚至可以为每个
getXXX
方法获得Error
对象,而不仅仅是nil
。当然,如果您真的只需要nil
,您可以编写一个helper来返回可选项。然后你可以这样做:
这里的想法是,您在
async let
点获得一个可以同时包含response * 和 * 错误的类型,而不是在以后捕获错误。v09wglhw2#
如果我理解正确的话,您需要:
如果这就是您要寻找的模式,我建议使用
Task
result
:或者,更简洁地说:
其中
goToNextPage
可定义为:这样,
goToNextPage
可以查看每个请求的.success
或.failure
,以检索与四个请求中的每个请求关联的值或错误。不用说,你也可以为这四个请求设置四个属性,然后
goToNextPage
可以引用这些属性,而不是把它们作为方法的参数。这在功能上是一样的,但是你必须决定是把本地变量传递给下一个方法,还是更新下一个方法访问的属性。你问:
......如果我们不想再使用
Result
,怎么办?是的,我们不再经常使用
Result
,因为在传统的异步模式中,它在历史上是一种返回值或错误的模式,而现在我们使用try
执行一系列任务,捕捉抛出的错误,但通常在其中一个失败时提前退出。但是,如果您真的希望捕获四个并发请求中每个请求的成功和失败,那么
Result
可以很好地封装它们。