ios - swift 中的ConfigureAwait 方法的模拟

标签 ios swift async-await

假设我有一个代码:

func someMethod() async {
... // processing 1
let someProperty = await someService.callSomeMethod()
... // processing 2
}

从 WWDC 可以清楚地看出,await 之前和之后执行的代码可以在不同的线程上执行。

但是如果我想保证单个线程执行怎么办?

很明显,如果我们正在谈论强制上下文切换到主线程,则使用 @MainActor 属性指定该方法就足够了,但假设我想将自己与特定线程隔离,对我来说唯一重要的是 someMethod 中的所有内容都在一个上下文中执行? (处理1和处理2具有相同的上下文)

简而言之,Swift 中有一些类似 ConfigureAwait (c Sharp) 的东西吗?

最佳答案

除了只有一个主线程之外,您无法真正保证有关线程的任何事情。异步/等待机制是完全免费的,每当您等待时,都可以在不同的线程上继续。

但这确实是低级别的,你不应该关心它。关键是您可以通过将所有代码放入单个参与者中来保证串行行为。基本上,不要同时运行一个方法两次的信号是使其成为一个 Actor 的方法。

(甚至您问题中的“隔离”一词都指向参与者。这就是参与者,它是一种隔离机制。)

一个稍微复杂的问题是 Actor 是可重入的。这意味着当一个 actor 方法说 await 时,actor 就会在等待时将自己打开以供调用。这可能会变得困惑。但这并不像让 Actor 陷入僵局那么困惑。

我强烈建议您阅读https://github.com/apple/swift-evolution/blob/main/proposals/0306-actors.mdhttps://github.com/apple/swift-evolution/blob/main/proposals/0313-actor-isolation-control.md 。你可能第一次无法理解它们——我当然没有——但是当我突然有了这个想法时,整套概念(参与者、隔离、非隔离、可重入、可发送)立刻就变得有意义了。

关于ios - swift 中的ConfigureAwait 方法的模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68686601/

相关文章:

ios - 使用 UIViewControllerAnimatedTransitioning 而不使用 Storyboard Segues

typescript - 是否已经可以在 react-native 中使用顶级 await?

c# - 使用 Async 避免重复代码

ios - 使用 Swift 复制静态变量

ios - 使用 Swift 在 Firebase 中读取快照中的数组

ios - 使用 Twilio 的可编程聊天时出现 401 未经授权访问

javascript - 从 Node 中的另一个模块导入的异步数据无法解析,我该如何解决这个问题?

iOS Swift 使用 NO_WRAP 选项将 HEX 字符串转换为 Base64

ios - 当类型为 SatelliteFlyover 时,在 MapView 顶部显示 MKPolyline?

ios - Swift 从 Nib 创建自定义 View