如果我声明这个协议和模型:
protocol SubScene: UIViewController {
func doSomething()
}
struct Model {
let subScene: SubScene
func longCalculation() async {
// Some long-running operation...
await subScene.doSomething()
}
}
class MyVC: UIViewController, SubScene {
func doSomething() {
performSegue(withIdentifier: "segue", sender: nil)
}
}
let myVC = MyVC()
let model = Model(subScene: myVC)
Task.detached {
await model.longCalculation()
}我已经声明了一个仅限于UIViewController的协议,以及一个从异步上下文调用协议的doSomething()方法的模型。由于UIViewController是一个MainActor,所以我期望在主线程上调用doSomething()。
然而,事实并非如此。实际上,await关键字会导致Swift发出警告,表示它没有调用异步方法。经验测试表明,doSomething()最终往往会在其他线程上被调用。
我可以通过将doSomething()注释为MainActor来解决这个问题。
protocol SubScene: UIViewController {
@MainActor func doSomething()
}这将消除Swift警告,并导致在正确的线程上调用doSomething()。
这是正确的方法吗?还是有另一种方法可以避免将所有的协议方法都洒在@MainActor上。
发布于 2022-06-10 19:38:35
您也可以将整个协议标记为@MainActor,例如,
@MainActor protocol SubScene: AnyObject {
func doSomething()
}这就避免了单独声明每个一致性方法的需要。
https://stackoverflow.com/questions/72577878
复制相似问题