0

ここで何かを理解しようとするのに苦労しており、いくつかのポインターを使用できます。Web ビューを持つアプリを作成します。特定の距離から開始し、ユーザーの位置を見つけ、そのポイントを中心にズームしてから、地図の注釈を追加したいと考えています。

これらの各要件の仕組みは理解していますが、順序付けに問題があり、順番に発生します。Obj-C の同時実行の性質により、次の開始前に 1 つのタスクが終了するとは限りません。

1 つのタスクを実行し、完了したら次のタスクを実行できるソリューションを探しています。これにはブロックが含まれると思いますが、これらすべてを学習しているだけで、頭が回転します。

提案をいただければ幸いです。前もって感謝します。

4

2 に答える 2

8

NSOperationと NSOperationQueues を使用すると、個々の操作を、最初に完了する必要がある操作に依存させることができます。

編集

オペレーションの使用方法を大まかに示します。詳細については、Concurrency Priogramming Guide のOperation Queuesセクションを参照してください。操作でできることのごく一部しか取り上げないため、これを読むことを強くお勧めします。

まず、オペレーションを作成します。ブロックを提供するブロック操作、Cocoa 呼び出しを提供する呼び出し操作を作成するか、自分で NSOperation クラスをサブクラス化し、オーバーライドmainして作業を行うことができます。

ブロック操作を選択するとしましょう:

NSBlockOperation op1 = [NSBlockOperation blockOperationWithBlock: 
                          ^{
                               // Do some work.
                          }];
NSBlockOperation op2 = [NSBlockOperation blockOperationWithBlock: 
                          ^{
                               // Do some different work.
                          }];
NSBlockOperation op3 = [NSBlockOperation blockOperationWithBlock: 
                          ^{
                               // Do yet more work.
                          }];

これで、これらすべてをキューに入れて実行できます。

NSOperationQueue* opQueue = [[NSOperationQueue alloc] init];
[opQueue addOperation: op1];
[opQueue addOperation: op2];
[opQueue addOperation: op3];

キューの最大同時操作数を設定しない限り、(使用可能なシステム リソースに応じて) すべての操作が並行して実行される可能性があります。op3 は、op1 と op2 が終了した後にのみ実行する必要があるとしましょう。依存関係を設定して関係をモデル化できます (操作をキューに入れる前に!)。

NSOperationQueue* opQueue = [[NSOperationQueue alloc] init];
[op3 addDependency: op1];
[op3 addDependency: op2];
[opQueue addOperation: op1];
[opQueue addOperation: op2];
[opQueue addOperation: op3];

これで、op3 は op1 と op2 が終了した後にのみ実行されます。これの素晴らしい点は、依存関係を設定してから、すべての操作をキューに押し込んで忘れることです (ただし、完了ハンドラーを op3 に追加して、すべての操作がいつ完了したかを通知するのは良い考えかもしれません)。次に、オペレーティング システムは、並列化と定義した順序付けに対する負荷のバランスを取ります。

于 2012-04-18T13:00:54.027 に答える
0

何かが最初に終了するのを待つ 1 つの方法は、BOOL を返すサブルーチンに入れることです。If (myMethod) { // 次にやりたいこと }

于 2012-04-18T12:13:08.373 に答える