swift 中的ConfigureAwait 方法的模拟

V.V*_*V.V 2 ios async-await swift

假设我有一个代码:

func someMethod() async {
... // processing 1
let someProperty = await someService.callSomeMethod()
... // processing 2
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

简而言之,swift中有一些类似的ConfigureAwait(c Sharp)?

mat*_*att 5

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

\n

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

\n

(甚至你问题中的“隔离”这个词都指向演员。这就是演员它是一种隔离机制。)

\n

一个稍微复杂的问题是 Actor 是可重入的。这意味着当一个 actor 方法说 时await,actor 会在等待时将其自身置于开放状态以供调用。这可能会变得混乱。但这并不像让演员陷入僵局那么混乱。

\n

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

\n