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)?
除了只有一个主线程之外,您无法真正保证有关线程的任何事情。异步/等待机制是完全免费的,无论何时您都await可以在不同的线程上继续。
但这确实是低级别的,你不应该关心它。关键是您可以通过将所有代码放入单个参与者中来保证串行行为。基本上,不要同时运行一个方法两次的信号是使其成为一个参与者的方法。
\n(甚至你问题中的“隔离”这个词都指向演员。这就是演员,它是一种隔离机制。)
\n一个稍微复杂的问题是 Actor 是可重入的。这意味着当一个 actor 方法说 时await,actor 会在等待时将其自身置于开放状态以供调用。这可能会变得混乱。但这并不像让演员陷入僵局那么混乱。
我强烈建议您阅读https://github.com/apple/swift-evolution/blob/main/proposals/0306-actors.md和https://github.com/apple/swift-evolution/blob/main/提案/0313-actor-isolation-control.md。你可能第一次通过 \xe2\x80\x94 无法掌握它们,我当然没有 \xe2\x80\x94 但当我突然有了这个想法时,整套概念(参与者、隔离、非隔离、可重入) ,可发送)立刻就变得有意义了。
\n| 归档时间: |
|
| 查看次数: |
343 次 |
| 最近记录: |