1

ユーザーがデバイスの再生ボタンをクリックしたときに実行されるメソッドを持つGameクラスがあります。-(void) play

メソッド内-(void) playには、ユーザーが [終了] ボタンをクリックするまで繰り返し実行される while ループがあります。この while ループは基本的に私のコードの中核であり、必要なすべてのメソッドが呼び出され、物事が起こり、オブジェクトが相互作用するなどです。

User クラスもあり (他のクラスの中でも..) 、Game クラスUser* playerのメソッドにインスタンスを作成し-(void) playていくつかの値を保存し、それらがゲームの期間中に他のものと相互作用するようにします..

ここで、(ゲーム中の任意の時点で..)磁北からのデバイスの偏差と、ユーザーがデバイスで実行している加速度を知る必要があります

コードを書きましたが、すべて正常に動作しています。ただし、プログラミングが初めてなので、コードの全体的な設計に関していくつか質問があります。これは、特に CoreLocation および CoreMotion フレームワークの使用に関しては混乱していると思います..

Game クラスの-(void) playメソッド (基本的には私の「メイン」メソッド) は、[game performSelectorInBackground:@selector(play) withObject:nil];Is this the right way to do it? のように別のスレッドで実行されます。

ただし、CoreMotion Acceleration の更新を-(void) playメソッド内から初期化[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 メソッド (基本的には私の「メイン」メソッド) は、[game performSelectorInBackground:@selector(play) withObject:nil]; のように別のスレッドで実行されます。これは正しい方法ですか?

場合によります。-playUI の応答性を高めるために、メソッドで実行している作業のうち、メイン スレッドから絶対に外さなければならないものはありますか (クレイジー ナンバー クランチ、サーバー リクエスト、テクスチャのロードなど)。メソッドが iOS のバックグラウンドにディスパッチされる唯一の理由は、レスポンシブ UI を維持するためです。なぜなら、UIKit クラスは単にスレッドセーフではないだけでなく、心から崖から飛び降りて、あなたのアプリを持って行こうとするからです。バックグラウンドで何でもします。

ただし、CoreMotion Acceleration の更新を -(void) play メソッド内から初期化します。つまり、これらの更新は、別のスレッドで実行されるメソッド (-(void) play) 内から実行されます。それは理にかなっていますか?

まあ、それはここに依存します。スレッド化の最終的な目標は、2 つ以上のスレッドが、別のスレッドが保持する 1 つのオブジェクトにアクセスしたり変更したりしないようにすることです。これは、さまざまな問題の始まりにすぎません。私が問題にしなければならないことの1つは、ドキュメントの非常に明確で不吉な警告にもかかわらず、メインキューを使用しているという事実です:

処理されたイベントは高速で到着する可能性があるため、メイン操作キューの使用はお勧めしません。

NSOperationQueueこれは、の強みであるバックグラウンド スレッドに投げるべき強力な計算の 1 つの例です。

これらすべてを User クラスにカプセル化し、[player getMyDegrees]; のようなメソッドを作成したいと考えています。[プレイヤー getMyAcceleration]; これは設計的に正しい方法ではありませんか?これらの更新を正確にどこで初期化する必要がありますか? どの特定のクラスメソッドの中から?

それは、あなたがどの程度のデザインを目指しているか、そして何を良いデザインと見なすかによって異なります。通常、優れたコードとは、別のプログラマーに引き渡して、ほとんど労力をかけずに始めたところから引き継いでもらうことができるコードです。そうは言っても、ユーザー クラスは MVC のコントローラー部分になるようです。クラスが大きすぎる場合は、分割してください。Objective-C のクラスは、驚くほど軽量な生き物です。一般的なセクションの実装を説明する複数のカテゴリに 1 つのクラスを配置しても問題ありません (たとえば、NSString のヘッダー)。

すべてを同じメイン スレッドで実行するか、同じ別のスレッドで実行するか、別の別のスレッドで実行する必要がありますか? よくわかりません..

すべての UI とライトはメイン スレッド (またはメイン キューの見方を好む場合はメイン キュー) で実行する必要があり、重いものとスレッドをブロックするものはすべてバックグラウンド スレッドに配置する必要があります。

于 2012-08-12T00:36:29.073 に答える