调用哪个线程[SKScene update:]?

时间:2013-11-16 07:42:25

标签: ios objective-c uiapplicationdelegate sprite-kit

我正在创建一个使用Sprite Kit的游戏,我的所有游戏代码都通过正在运行的update:的{​​{1}}方法运行。我自己不创建任何其他线程。

我的理解是应用程序委托方法:

SKScene

在主线程上运行。

如果在主线程上调用- (void)applicationWillResignActive:(UIApplication *)application - (void)applicationDidEnterBackground:(UIApplication *)application - (void)applicationWillEnterForeground:(UIApplication *)application - (void)applicationDidBecomeActive:(UIApplication *)application ,我是否可以确定如果我对正在运行的update:的成员变量进行更改(当调用任何委托方法时),那么{ {1}}方法会看到更改吗?

在执行SKScene方法时,是否有可能执行上述任何委托方法,反之亦然?

编辑:委托方法和[SKScene update:]是否在同一(主)线程上执行?

2 个答案:

答案 0 :(得分:3)

我不是精灵专家,但总的来说: 两个方法永远不会在同一个线程中同时运行。

当你的[update:]方法正在执行时,它正在阻塞该线程进行其他执行(检查NSRunLoop机制)。因此,如果委托方法需要在该线程中执行,那么它将被安排用于下一个运行循环周期。反之亦然。

这里有一些很好的解释:Understanding NSRunLoop并参考了Apple文档。

答案 1 :(得分:1)

确定。我正在回答我自己的问题,因为我已经验证了我的答案

1)委托方法和[SKScene update:]在主线程上执行。我通过调用[NSThread isMainThread]验证了这一点,并且还因为Xcode在线程执行/调用堆栈窗口中显示了线程名称

2)当应用程序处于非活动状态时,仍然会调用更新,因此在下一个循环或调用applicationWillResignActive:时是否调用它是不是很重要。

3)执行applicationDidEnterBackground:后,不会调用update:。