ios - 如何正确消除这个并发编译错误?

标签 ios swift concurrency swift-concurrency

@MainActor
class A {}

class VC: UIViewController {
  let foo: A

  init() {
    self.foo = A() // Error: Call to main actor-isolated initializer 'init()' in a synchronous nonisolated context
    super.init(nibName: nil, bundle: nil)
  }

  @MainActor
  init() {
    self.foo = A() // Compiles
    super.init(nibName: nil, bundle: nil)
  }

  init(_ void: Void = ()) { 
    self.foo = A() // Compiles
    super.init(nibName: nil, bundle: nil)
  }
}

我明白了A()应该在主要参与者初始化程序上调用,但为什么第一个初始化程序不继承 @MainActor来自UIViewController ?以及为什么 Void参数消除了错误(即使使用 -warn-concurrency )?

注意:如果我注释 VC@MainActor ,我对 super.init 遇到同样的错误在第一个初始化程序中,第三个初始化程序仍然有效。

最佳答案

@MainActor 限制 A 类主线程中的所有方法和属性。

let foo: A 不是类 A,它是存储对类 A 的引用的实例,您没有采取任何措施来使设置 foo 线程安全。 VC 的一个 init 设置为仅在设置 foo 的主线程中执行,但另一个可以由任何线程调用并设置 foo .

编辑:我认为您可能会发现有用的更多信息 如果您的唯一目标是线程安全,那么使用 MainActor 不是一个好方法,这意味着只有与 GUI 交互相关的线程才能访问您的类,这可能会阻止某些必须在主线程中运行的实际代码执行,因为线程安全你可能更好地使用参与者,它们像类一样工作,但一次只能有一个线程在其中,它们可以是任何线程,并且不同的方法可以由不同的线程在不同的时间访问,但只有一个会一次只是 Actor 。

关于ios - 如何正确消除这个并发编译错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71494123/

相关文章:

ios - 创建一个具有相同高度的静态单元格的 View 表以填充屏幕

swift - 将 nib 的 headerView 添加到 UICollectionView swift

java - 调度 Swingworker 线程

iOS Swift 过滤器和生成模型需要太多时间

ios - 通过 URL 在 CollectionView 中显示图像时出现问题

ios - UITableView 的高度未以编程方式更改

ios - Alamofire 序列化太慢

java - 同步访问的方法是否应该同步?

java - foreach循环会导致线程并发吗?

ios - 如何等待 NSURLSession 的所有任务完成?