为什么SKNode要绑定MainActor?

问题描述 投票:0回答:1

在以下代码中:

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 没有),以及如何解决这个问题?

swift concurrency sprite-kit scenekit
1个回答
0
投票

SKNode
UIResponder
的子类,并且
UIResponder
与主要参与者隔离,因此
SKNode
也是如此。

另请参阅节点入门:确保主线程上的节点访问。他们明确表示您必须在主线程上执行此操作(证明对主要参与者的隔离是合理的)。

要解决此问题,您可以通过将

createNode
与主要参与者隔离来解决此问题,例如
@MainActor public func createNode() -> {…}
。或者,如果
Foo
有必要的话,也许也可以将其隔离给主要演员。如果没有看到更多的
Foo
实现、如何确保其线程安全性等,很难具体说明。但希望这足以让您继续前进。

© www.soinside.com 2019 - 2024. All rights reserved.