swift - 如何结合这两种异步方法的结果?
问题描述
我有两种方法可以调用。我需要生成一个包含两者结果的模型并调用另一个方法。
我想避免将 1 个方法放在另一个方法中,因为这可能会扩展到 3 或 4 个额外的调用。
基本上,一旦我得到结果setUserFollowedState
并且loadFollowersForTopic
我想将这两个值发送到另一个函数。
来自我会使用的 JS 领域,async/await
但这在 Swift 中不存在。
func setUserFollowedState() {
following.load(for: userID, then: { [weak self, topic] result in
guard self != nil else { return }
let isFollowed = (try? result.get().contains(topic)) ?? false
// do something with isFollowed?
})
}
func loadFollowersForTopic() {
followers.load(topic, then: { [weak self, topic] result in
guard self != nil else { return }
let count = (try? result.get().first(where: { $0.tag == topic })?.followers) ?? 0
// do something with count?
})
}
解决方案
您可以将两个异步调用结果存储为可选属性。当您的回调发生时,设置这些属性,然后检查两个属性是否已设置。如果它们已设置,则您知道两个异步调用都已返回。
private var isFollowed: Bool?
private var count: Int?
func setUserFollowedState() {
following.load(for: userID, then: { [weak self, topic] result in
guard let self = self else { return }
let isFollowed = (try? result.get().contains(topic)) ?? false
self.isFollowed = isFollowed
performPostAsyncCallFunctionality()
})
}
func loadFollowersForTopic() {
followers.load(topic, then: { [weak self, topic] result in
guard let self = self else { return }
let count = (try? result.get().first(where: { $0.tag == topic })?.followers) ?? 0
self.count = count
performPostAsyncCallFunctionality()
})
}
private func performPostAsyncCallFunctionality() {
// Check that both values have been set.
guard let isFollowed = isFollowed, let count = count else { return }
// Both calls have returned, do what you need to do.
}
这种方法的好处是您可以使用该模式轻松添加更多异步调用。但是,如果您需要一次进行这么多异步网络调用,我建议您考虑重写服务器端逻辑,这样您只需要一个网络调用即可实现此功能。
推荐阅读
- javascript - 使元素向中心隐藏,React.js
- apache - .htaccess 用问号重写 URL
- javascript - 如何使用 Emscripten 和 Embind 发出的 .js 和 .wasm 工件?
- flutter - 打开屏幕时,getter 'stream' 在 null 上被调用,突然显示列表
- plotly - 在 Plotly 中以特定值开始轴范围
- html - 我想对齐包含时间元素的列表元素中的文本
- powershell - powershell - 跳过脚本部分或跳转到另一部分
- forms - 在 EasyAdmin 3 和 symfony 5 中使用 EntityType 表单进行编辑和新建
- excel - 包含不带空格的文本的单元格中的数字总和
- sql - SQL:过滤后合并列值