在我使用Swift制作的iOS游戏中,我正在听触摸事件,阅读某些userData
的{{1}}属性,并更新其他SKNode
的其他SKSpriteNode
的纹理属性是场景的一部分,但为了避免在用户交互过程中出现任何延迟,我在主队列上异步调度此更新代码,这是一个好主意吗?
顺便提一下,有关线程安全的一般性问题:只有在编写数据时才存在风险,或者在读取数据时是否存在风险?
谢谢。
答案 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()
块。