首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类约束协议不采用MainActor

类约束协议不采用MainActor
EN

Stack Overflow用户
提问于 2022-06-10 17:19:47
回答 1查看 95关注 0票数 1

如果我声明这个协议和模型:

代码语言:javascript
复制
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来解决这个问题。

代码语言:javascript
复制
protocol SubScene: UIViewController {
  @MainActor func doSomething()
}

这将消除Swift警告,并导致在正确的线程上调用doSomething()

这是正确的方法吗?还是有另一种方法可以避免将所有的协议方法都洒在@MainActor上。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-10 19:38:35

您也可以将整个协议标记为@MainActor,例如,

代码语言:javascript
复制
@MainActor protocol SubScene: AnyObject {
    func doSomething()
}

这就避免了单独声明每个一致性方法的需要。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72577878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档