【发布时间】:2020-04-13 03:09:00
【问题描述】:
在 Xcode 11 beta 破解 PK v7 之前,我在一个项目中成功使用了 PromiseKit。为了减少外部依赖,我决定废弃 PromiseKit。处理链式异步代码的最佳替代品似乎是使用新的 Combine 框架的 Futures。
我正在努力使用 Combine 来复制简单的 PK 语法
例如。简单的 PromiseKit 链式异步调用语法
getAccessCodeFromSyncProvider.then{accessCode in startSync(accessCode)}.then{popToRootViewController}.catch{handleError(error)}
我明白了:
async/await 的 Swift 标准库实现将解决这个问题(async/await 尚不存在,尽管来自 Chris Latter himself 的大量讨论和参与)
我可以使用信号量进行复制(容易出错?)
flatMap 可用于链接 Futures
我想要的异步代码应该能够按需调用,因为它涉及确保用户登录。我正在努力解决两个概念问题。
-
如果我将 Futures 包装在一个方法中,并使用
sink来处理结果,那么在sink调用订阅者之前,该方法似乎超出了范围。 -
由于 Futures 只执行一次,我担心如果我多次调用该方法,我只会从第一次调用中得到旧的、陈旧的结果。要解决这个问题,也许我会使用 PassthroughSubject?这允许按需调用 Publisher。
问题:
- 我是否必须保留所有发布者和订阅者 调用方法
- 如何使用 Swift 标准库复制简单的链式异步,然后将其嵌入到我可以按需调用以从顶部重新启动链式异步调用的快速实例方法中??
//how is this done using Combine?
func startSync() {
getAccessCodeFromSyncProvider.then{accessCode in startSync(accessCode)}.catch{\\handle error here}
}
【问题讨论】:
-
极其广泛和广泛。你能把问题集中在下面吗?至少解释你的代码的目标。假设我们不知道您的任何方法的作用。你说“这是怎么做到的”,但“这个”是什么?
-
马特,爱你的书!!当我第一次学习时,它们很重要。我将尝试使用特定的代码流来简化问题。作为第一个切入点,我想说我正在尝试在 Swift 中实现最简单的异步/等待形式,在最高抽象级别上,而不依赖于像 PromiseKit 这样的第三方库。 PK 有我想复制的美妙语法。我使用 PK 的代码读起来有点像“firstly{async}.then{async}.recover{async}.done{clean-up}.catch{handle errors}”。自我记录,易于推理。这是我的目标,只使用 Swift 标准库。
-
啊哈!好吧,Combine 不是 PromiseKit,恐怕。您可以肯定地链接异步事物,但它不会是相同的。
标签: swift asynchronous combine