我正在创建一个使用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:]是否在同一(主)线程上执行?
答案 0 :(得分:3)
我不是精灵专家,但总的来说: 两个方法永远不会在同一个线程中同时运行。
当你的[update:]方法正在执行时,它正在阻塞该线程进行其他执行(检查NSRunLoop机制)。因此,如果委托方法需要在该线程中执行,那么它将被安排用于下一个运行循环周期。反之亦然。
这里有一些很好的解释:Understanding NSRunLoop并参考了Apple文档。
答案 1 :(得分:1)
确定。我正在回答我自己的问题,因为我已经验证了我的答案
1)委托方法和[SKScene update:]
在主线程上执行。我通过调用[NSThread isMainThread]
验证了这一点,并且还因为Xcode在线程执行/调用堆栈窗口中显示了线程名称
2)当应用程序处于非活动状态时,仍然会调用更新,因此在下一个循环或调用applicationWillResignActive:
时是否调用它是不是很重要。
3)执行applicationDidEnterBackground:
后,不会调用update:。