1

iOS アプリケーションでシーケンシャル ジョブを実行したいと考えています。前のジョブが完了するまでジョブが実行されないようにしたい。まず、このようなことをしようとしました

group = dispatch_group_create();
queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_group_async(group, queue, ^{
// Job 1
// ...
});
dispatch_group_async(group, queue, ^{
// Job 2
// ...
});

このように、ジョブ 1 がまだ実行されているときに、ジョブ 2 の実行が開始されることがあります。

次に、この方法を使用することを考えました:

group = dispatch_group_create();
queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_group_notify(group, queue, ^{
// Job 1
// ...
});
dispatch_group_notify(group, queue, ^{
// Job 2
// ...
});

ジョブ 1 は非同期にディスパッチされていないため、動作は同じです。そのため、dispatch_group_notify()関数は何も実行されていないと見なし、ジョブ 2 はジョブ 1 を待機せずにディスパッチされます。

別の解決策を見つけました:

group = dispatch_group_create();
queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_group_notify(group, queue, ^{
    dispatch_group_async(group, queue, ^{
    // Job 1
    // ...
    });
});
dispatch_group_notify(group, queue, ^{
    dispatch_group_async(group, queue, ^{
    // Job 2
    // ...
    });
});

今、すべてが正常に動作します。

このディスパッチ インサイド ディスパッチ構造に何か問題はありますか? それとも大丈夫ですか?

ありがとうございました!

4

2 に答える 2

2

取得するグローバル キュー

queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

同時キューです。ジョブを順番に実行したい場合は、シリアルキューを作成します。

queue = dispatch_queue_create("com.company.myqueue", NULL);
于 2013-06-05T12:00:47.303 に答える