ios - SKNode线程安全吗?

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

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

顺便问一下关于线程安全的一些一般性问题:是只有在写入数据时才有风险,还是在读取数据时也有风险?

谢谢。

最佳答案

当前documentation on SKNodegetting 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/

相关文章:

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

java - 为什么慢任务会阻塞该使用并行流的程序中的其他较小任务?

PHP脚本执行和多线程环境(PHP5扩展)

iphone - 将自定义中心按钮添加到标签栏的最佳方式是什么?

iOS Facebook Graph API 使用 "next"或 "previous"Url 使用 SDK 进行分页

ios - 链接静态库不与主项目一起重建

java - 非线程安全类

ios - 单击键盘上的 "Done"可关闭键盘,但不会被关闭

swift - 协议(protocol)类型数组

ios - 如何在 iOS 10 中替换折旧的 UILocalNotification 并添加 UNNotificationAction