在我用 Swift 制作的 iOS 游戏中,我正在监听触摸事件,读取一些 SKNode
的 userData
属性,并更新其他一些的纹理属性SKSpriteNode
是场景的一部分,但为了避免在用户交互过程中出现任何延迟,我在主队列上异步调度此更新代码,这是个好主意吗?
顺便问一下关于线程安全的一些一般性问题:是只有在写入数据时才有风险,还是在读取数据时也有风险?
谢谢。
最佳答案
当前documentation on SKNode
在 getting started 中说部分:
Ensure Node Access on the Main Thread
所以,标题中问题的答案
Is SKNode thread safe?
是 - 否。 SKNode
不是线程安全的,只能从主线程对其进行修改。
但是第二个问题的答案:
I dispatch this update code asynchronously on the main queue, is it a good idea?
将是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()
将在 2 个线程中同时调用,则可能会发生这种情况。在实际创建 bigLazyObject
之前,两个线程都有可能落入 if
语句的 else
分支。这种问题应该在创建线程安全的单例时解决。在 Swift 中,它们是线程安全的,但在 Objective-C 中,人们通常使用 dispatch_once()
block 。
关于ios - SKNode线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37420469/