SKNode线程安全吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SKNode线程安全吗?相关的知识,希望对你有一定的参考价值。
在我用Swift制作的ios游戏中,我正在听触摸事件,阅读一些userData
的SKNode
property,并更新其他一些SKSpriteNode
的纹理属性,这是场景的一部分,但为了避免在用户交互过程中出现任何延迟,我在主队列上异步发送这个更新代码,这是个好主意吗?
顺便提一下,关于线程安全的一些一般性问题:只有在编写数据时是否存在风险,或者在读取数据时是否存在风险?
谢谢。
答案
正如目前的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()
块。
以上是关于SKNode线程安全吗?的主要内容,如果未能解决你的问题,请参考以下文章