SKNode线程安全吗?

时间:2016-05-24 17:45:20

标签: ios swift multithreading sprite-kit grand-central-dispatch

在我使用Swift制作的iOS游戏中,我正在听触摸事件,阅读某些userData的{​​{1}}属性,并更新其他SKNode的其他SKSpriteNode的纹理属性是场景的一部分,但为了避免在用户交互过程中出现任何延迟,我在主队列上异步调度此更新代码,这是一个好主意吗?

顺便提一下,有关线程安全的一般性问题:只有在编写数据时才存在风险,或者在读取数据时是否存在风险?

谢谢。

1 个答案:

答案 0 :(得分:0)

正如当前documentation on SKNode所说:

  

对节点的操作必须在主线程中进行。

那么,标题中问题的答案

  

SKNode线程安全吗?

是 - SKNode不是线程安全的,只应从主线程修改。

但第二个问题的答案是:

  

我在主队列上异步调度此更新代码,这是一个好主意吗?

。这正是你所期望的。

至于最后一个问题:阅读数据时可能存在风险。如果您读取let version = 3之类的常量,则不会有任何风险。但请看一下这个例子:

var bigLazyObject: BigObject?

func getBigLazyObject() -> BigObject {
    if let existingObject = bigLazyObject {
        return existingObject
    } else {
        let newObject = BigObject()
        bigLazyObject = newObject
        return newObject
    }
}

它演示了第二个BigObject实例的不需要的创建,如果同时在2个线程中调用getBigLazyObject(),则可能会发生这种情况。在实际创建else之前,两个线程都有可能落入if语句的bigLazyObject分支。创建线程安全的单例时应该解决这类问题。在Swift中,它们是线程安全的购买默认值,但在Objective-C中,人们通常使用dispatch_once()块。