2012-03-13 9 views
4

私はGCDのメインキューを次のように取得し、私は自分のアプリケーションの異なるクラスから別のタスクを追加します。GCDキューでタスクリストを取得する方法は?

dispatch_queue_t queue = dispatch_get_global_queue (
    DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

ここで、GCDのメインキューにまだ残っているタスクの数を知りたいと思います。

GCDキューにタスクリストを取得する方法はありますか?

ありがとう

+0

GCDタグは「最大公約数」のために予約されています。 – paxdiablo

答えて

4

これは実際にGCDのパラダイムではありません。たとえば、特定の操作グループを追跡したい場合は、この例のように、ディスパッチグループを作成し、完了したときに通知を受けるためにサインアップすることができます。

dispatch_group_t taskGroup = dispatch_group_create(); 
dispatch_queue_t queue = //Get whatever queue you want here 
dispatch_group_async(taskGroup, queue,^{ 
    [object doSomething]; 
}); 
dispatch_group_async(taskGroup, queue,^{ 
    [object doMoreStuff]; 
}); 
dispatch_group_async(taskGroup, queue,^{ 
    [object doEvenMoreStuff]; 
}); 
dispatch_group_notify(taskGroup, queue, ^{ 
    [object workDone]; 
}); 
dispatch_release(taskGroup); 
+0

申し訳ございませんが、私のアプリにディスパッチグループを適用できませんでした。複数のクラスがGCDキューに複数のタスクを追加するため。ディスパッチグループは、クラスの単一のインスタンスにのみ適用されるようです。私の状況は、グローバルレベルの中央プール内の複数のクラスからタスクを監視したいということです。 – user403015

+0

dispatch_group_notifyブロック内のdispatch_releaseの代わりに、dispatch_group_releaseを使用してはいけませんか? – droussel

+1

キューにはグループが保持されるので、追加した後に解放するのが安全です(または恐ろしい間違いを犯してアプリケーションが機能しません^^;) – borrrden

2

通常、これはキューではなくディスパッチグループで行われます。 dispatch_group_async()を使用してグループにタスクを割り当てたり、dispatch_group_enter()dispatch_group_leave()を使用して手動でグループ内のものにマークを付けることができます。グループ内にdispatch_group_notify()またはdispatch_group_wait()のいずれかを使用しているものがあるかどうかを確認できます。

+0

ディスパッチグループを適用できませんでした私のアプリ。複数のクラスがGCDキューに複数のタスクを追加するため。ディスパッチグループは、クラスの単一のインスタンスにのみ適用されるようです。私の状況は、グローバルレベルの中央プール内の複数のクラスからタスクを監視したいということです。 – user403015

+2

グループはディスパッチ時点で追加されます。それはクラスとは関係がありません。 'dispatch_'メソッドを直接呼び出すのではなく、' NSOperations'を使用していますか? 'dispatch_'メソッドを使用している場合は、その時点でグループを適用することができます。 –

+0

私の状況:クラスA、クラスBおよびクラスCは、自分のインスタンス内でGCDにタスクを追加します。異なるクラスの共通ディスパッチグループを作成するにはどうすればよいですか?作成したグループを別のクラスに渡すことはできますか?ありがとう。 – user403015

関連する問題