まず、私は Objective-C の初心者です。私のバックグラウンドのほとんどは Java です。また、ほとんどの Objective-C に関する質問は Cocoa に関するものであるため、これはGNUStepに関するものであることを指摘しておく必要があります。
学校のプロジェクトのために、単純なエージェント ベースのモデリング フレームワークを作成しています。これらのフレームワークは通常、複雑なシステム (病気の蔓延など) をモデル化するために使用されます。私のフレームワークには、ワールドとバグという 2 つの主要なオブジェクトがあります。世界は「レイヤー」で構成され、各レイヤーはトロイダル グリッドに関連付けられています。世界には虫が住むことができ、それぞれの虫には x 座標と y 座標、および虫が属するレイヤーがあります。
私の一般的な考えは、世界にバグを追加し、バグごとにスレッドを起動して、バグがやりたいようにすることです。メイン クラスをサブクラス化し、プロトコルで定義されたメソッドBug
を実装することで、あらゆる種類のバグを作成できます。act
このようにして、さまざまな種類のカスタム バグとカスタム動作を作成できます。バグは、世界と相互にやり取りできる必要があります (世界からバグを削除したり、世界にバグを追加したり、自分自身を移動したりします)。ご覧のとおり、これはすぐにマルチスレッド地獄に向かっています。
現在、私はたくさんの@synchronized
ブロックを持っており、世界が常に一貫した状態に保たれるようにするのに苦労しています。バグは世界と通信して行動する必要があり、その逆も同様であるため、これは特に困難になります。RandomBug
世界中をランダムに移動するa という単純なバグを実装しようとしています。状態が破損したり無効になったりする可能性がある潜在的な問題が見られるため、これでさえ困難であることが証明されています。
と を調べ始めたのはNSOperation
、NSOperationQueue
これにより作業が簡単になる可能性があるためです。これに関して2つの質問があります。
NSOperation
s を繰り返し (つまり、特定の間隔で)実行する簡単な方法はありますか。- スレッドの最大同時操作数を 1 に設定した場合でも、
@synchronized
ブロックは必要ですか? ある時点で世界とやり取りするスレッドは 1 つだけではありませんか? - この種の問題 (複数のスレッドが 1 つの共有リソースと繰り返し対話する) に取り組むためのより良い方法はありますか?
- スレッド化を完全にやめて、単純に世界のバグを反復処理し、ランダムにアクティブ化する必要がありますか?