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 に追加して、すべての操作がいつ完了したかを通知するのは良い考えかもしれません)。次に、オペレーティング システムは、並列化と定義した順序付けに対する負荷のバランスを取ります。