私は GCD を使用して、画像操作などの重い作業を行っています。多くの場合、3 つまたは 4 つのタスクを同時に実行しています。
これらのタスクの中には、他のタスクよりも早く完了するものがあります。シリアル キューを使用せずに、コールバックが正しい元の順序で起動されるようにするにはどうすればよいですか?
例えば:
- タスク 1 の所要時間は 1 秒です
- タスク 2 は 5 秒かかります
- タスク 3 には 2 秒かかります
さまざまな計算時間にもかかわらず、1、2、3 の最終コールバック順序を確保するにはどうすればよいですか?
// self.queue = dispatch_queue_create("com.example.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(self.queue, ^{
// Long-running code here of varying complexity
dispatch_async(dispatch_get_main_queue(), ^{
// Callback here
});
});
編集:
コメントによると、残りのタスクが処理中であっても、タスク 1 が完了するとすぐに最初の通知が送信されます。タスク 3 が完了すると、タスク 2 が完了するまで保持され、最初にタスク 2 と 3 の通知が立て続けに送信されます。
タスクをプッシュおよびシフトするためのある種の可変配列が機能すると考えています。しかし、よりクリーンな方法はありますか?