在以下代码中:
public class Foo {
public func createNode() -> SCNNode {
return SCNNode()
}
public func createNode() -> SKNode {
return SKNode()
}
}
使用 Swift 6 严格并发检查进行编译,
return SKNode()
行无法编译,并出现错误 Call to main actor-isolated initializer 'init()' in a synchronous nonisolated context
和建议的修复Add '@MainActor' to make instance method 'createNode()' part of global actor 'MainActor'
。
对 SKNode 方法或属性的任何调用都会执行相同的操作。
使用
return SCNNode()
就不会发生这种情况。
在我的应用程序中,这些方法应该在我的
SCNSceneRendererDelegate
方法中调用,例如 renderer(_:updateAtTime:)
,所以我不能承受返回 MainActor 的惩罚。
为什么 SKNode 绑定到 MainActor(而 SCNNode 没有),以及如何解决这个问题?
SKNode
是 UIResponder
的子类,并且 UIResponder
与主要参与者隔离,因此 SKNode
也是如此。
另请参阅节点入门:确保主线程上的节点访问。他们明确表示您必须在主线程上执行此操作(证明对主要参与者的隔离是合理的)。
要解决此问题,您可以通过将
createNode
与主要参与者隔离来解决此问题,例如 @MainActor public func createNode() -> {…}
。或者,如果Foo
有必要的话,也许也可以将其隔离给主要演员。如果没有看到更多的 Foo
实现、如何确保其线程安全性等,很难具体说明。但希望这足以让您继续前进。