我有一个Game
类,其中-(void) play
方法将在用户点击设备上的“播放”按钮时执行。
在-(void) play
方法中,我有一个while循环,它将重复执行,直到用户点击Quit按钮。这个while循环基本上是我的代码的核心,其中所有必要的方法被调用,事情发生,对象交互等。
我还有一个User类(在其他类中......)我在我的Game类的User* player
方法中创建了一个-(void) play
实例来存储一些值并让它们与其他东西进行交互游戏的持续时间..
现在我需要知道(在比赛期间的任何时刻......)设备偏离磁北极&用户在设备上行使的加速度
我编写了代码,一切都正常工作。但是,作为编程新手,我有一些关于我的代码的总体设计的问题,我认为一团糟,特别是在使用CoreLocation& CoreMotion框架 ..
Game类的-(void) play
方法(基本上是我的“主”方法)在[game performSelectorInBackground:@selector(play) withObject:nil];
中的单独线程上执行这是正确的方法吗?
但是,我在-(void) play
方法中初始化CoreMotion Acceleration更新,如[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]withHandler:^(CMDeviceMotion *motion, NSError *error){...}
中所示,这意味着更新将存储在主队列中,而初始化这些更新的方法则从方法内部执行( -(void) play
)在一个单独的线程上运行。这有意义吗?
初始化Game类的实例时,我也初始化了CoreLocation更新。更奇怪的是?
我的观点是这样的。鉴于我将测量用户在设备上行使的加速度以及他/她给予设备的方向(度)我想要封装我的User类中的所有内容并使用[player getMyDegrees];
等方法[player getMyAcceleration];
这不是设计方面的正确方法吗?我应该在哪里初始化这些更新?从哪个特定的类方法?一切都应该在同一个主线程或同一个单独的线程上运行,还是在不同的单独线程上运行?我很困惑..
答案 0 :(得分:0)
线程是一个复杂的问题,因为你无疑已经看过了。
Game类的 - (void)play方法(基本上是我的 “main”方法)在[游戏中]在单独的线程上执行 performSelectorInBackground:@ selector(play)withObject:nil];这是 正确的方法吗?
这取决于。在-play
方法中是否有任何必须从主线程中取出的工作(即疯狂数字运算,服务器请求,加载纹理等),以使UI更具响应性?这是在iOS上调度方法的唯一原因,就是保持响应式用户界面,因为UIKit类不仅仅是线程不安全,而且如果你试图将他们全心全意地从悬崖上直接下潜并带上你的应用程序在后台做任何事情。
但是,我从内部初始化CoreMotion Acceleration更新 - (void)play方法......这意味着......这些更新是在一个单独的线程上运行的方法( - (void)play)内执行的。是否 那有意义吗?
嗯,这又取决于这里。线程的最终目标不是让两个或多个线程试图访问或改变另一个线程持有的一个对象,这只是一堆问题的开始。我必须要回答的一件事是,尽管documentation中有一个非常明确和不祥的警告,你正在使用主队列:
因为处理过的事件可能会以很高的速度到达,所以使用 不建议使用主操作队列。
这是一个高功率计算之一的示例,您应该将其投射到后台线程,这是NSOperationQueue
的强项。
我想在我的User类中封装所有内容并使用类似的方法 [玩家getMyDegrees];和[player getMyAcceleration];不是这个 正确的设计方式?我应该在哪里初始化那些 更新?从哪个特定的类方法?
这取决于你想要的设计方式,以及你认为好的设计。好的代码通常是代码,你可以把它交给另一个程序员,让他们在你开始的地方轻松上手。话虽这么说,听起来你的用户类将成为MVC的控制器部分。如果你的课程太笨重,那就切断吧。 objective-c中的类是令人惊讶的轻量级生物。甚至在描述一般部分实现的多个类别中安排一个类也很好(例如NSString的标题)。
是否所有内容都在同一主线程上运行或相同 单独的线程或不同的单独线程?我很困惑..
所有UI和灯应该在主线程(或主队列,如果你更喜欢看它)中运行,并且所有重量和线程阻塞应该放在后台线程中。