1

我有一个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单独线程上运行的 method() 内部执行的。那有意义吗?

当我初始化我的 Game 类的实例时,我也会初始化 CoreLocation 更新。更诡异?

我的观点是这样的。鉴于我将测量用户在设备上锻炼的加速度以及他/她给设备的方向(度数),我想将所有这些都封装在我的 User 类中并具有类似[player getMyDegrees];[player getMyAcceleration];方法正确的设计方式?我应该在哪里初始化这些更新?从内部哪个特定的类方法?一切都应该运行在同一个主线程还是同一个单独的线程或不同的单独线程上?我很困惑..

4

1 回答 1

0

毫无疑问,线程是一个复杂的问题。

Game 类的 -(void) play 方法(基本上是我的“main”方法)在单独的线程上执行,如 [game performSelectorInBackground:@selector(play) withObject:nil]; 这是正确的方法吗?

这取决于。您在方法中是否有任何工作-play必须从主线程中移除(即疯狂的数字运算、服务器请求、加载纹理等)以使 UI 更具响应性?这确实是在 iOS 上将方法分派到后台的唯一原因,是为了维护响应式 UI,因为 UIKit 类不仅是线程不安全的,而且如果您尝试这样做,它们会全心全意地从悬崖上跳下来并带走您的应用程序在后台做任何事情。

但是,我从 -(void) play 方法内部初始化 CoreMotion Acceleration 更新……这意味着……这些更新是从在单独线程上运行的方法(-(void) play) 内部执行的。那有意义吗?

好吧,这又取决于这里。线程化的最终目标不是让两个或多个线程尝试访问或改变另一个线程持有的一个对象,这只是一大堆问题的开始。我必须解决的一件事是,尽管文档中有一个非常明确和不祥的警告,但您仍在使用主队列:

因为处理的事件可能会以很高的速率到达,所以不建议使用主操作队列。

这是您应该将其扔给后台线程的高功率计算之一的示例,这是NSOperationQueue的强项。

我想将所有内容封装在我的 User 类中,并使用 [player getMyDegrees] 之类的方法;和[玩家getMyAcceleration];这不是正确的设计方式吗?我应该在哪里初始化这些更新?从内部哪个特定的类方法?

这取决于您尝试的设计方式,以及您认为什么是好的设计。好的代码通常是您可以将其交给其他程序员并让他们从您开始的地方轻松获取的代码。话虽如此,听起来您的用户类将成为 MVC 的控制器部分。如果你的课程太庞大,就把它们删掉。Objective-c 中的类是令人惊讶的轻量级生物。即使在描述通用部分实现的多个类别中安排一个类也很好(例如 NSString 的标题)。

一切都应该运行在同一个主线程还是同一个单独的线程或不同的单独线程上?我很困惑..

所有 UI 和轻量级都应该在主线程中运行(或主队列,如果你喜欢这样看的话),所有重度和线程阻塞都应该放在后台线程中。

于 2012-08-12T00:36:29.073 回答