在我和Swift一起制作的一个iOS游戏中,我正在监听触摸事件,读取一些SKNode的userData属性,并更新场景中其他SKSpriteNode的texture属性,但为了避免用户交互过程中的任何延迟,我在主队列上异步分发此更新代码,这是一个好主意吗?
顺便提一下,关于线程安全的一些一般性问题:是只在写入数据时存在风险,还是在读取数据时也存在风险?
谢谢。
发布于 2017-12-25 08:28:04
正如当前documentation on SKNode在getting started部分中所说的:
确保对主线程的节点访问
因此,标题中的问题的答案
是SKNode线程安全的吗?
is - NO。SKNode不是线程安全的,应该只从主线程修改它。
但第二个问题的答案是:
我在主队列上异步分派这个更新代码,这是个好主意吗?
will be YES.这正是您所期望的。
至于最后一个问题:读取数据时可能存在风险。如果您读取像let version = 3这样的常量,就不会有任何风险。但是看看这个例子:
var bigLazyObject: BigObject?
func getBigLazyObject() -> BigObject {
if let existingObject = bigLazyObject {
return existingObject
} else {
let newObject = BigObject()
bigLazyObject = newObject
return newObject
}
}它演示了第二个BigObject实例的意外创建,如果将在两个线程中同时调用getBigLazyObject(),则可能会发生这种情况。在实际创建if之前,这两个线程都有可能落在bigLazyObject语句的else分支中。这类问题应该在创建线程安全的单例时解决。在Swift中,它们是线程安全购买默认值,但在Objective-C中,人们通常使用dispatch_once()块。
https://stackoverflow.com/questions/37420469
复制相似问题