3

dispatch_queue_t変数間の同等性を確認するにはどうすればよいですか?

dispatch_queue_t currentQueue = dispatch_get_current_queue();
dispatch_queue_t mainQueue = dispatch_get_main_queue();
if (currentQueue == mainQueue) {

}

ドキュメントから:

typedef struct dispatch_queue_s *dispatch_queue_t;

よくわかりませんが、これは、dispatch_queue_s構造体へのポインターであることを意味しますか?

ポインタの同等性を確認できないため、dispatch_queue_tが別のものと同じであるかどうかを確認するにはどうすればよいですか?

4

3 に答える 3

23

dispatch_get_current_queue()は非推奨になっているため、現在のキューとキューをラベル(または@jkhが提案する詳細)で比較できます。

ラベル用

dispatch_queue_get_label(dispatch_queue_t queue);

現在のキューのラベルを取得するためにDISPATCH_CURRENT_QUEUE_LABELを渡します

具体的には:

dispatch_queue_get_specific(dispatch_queue_t queue, const void *key);

特定のキューを取得し、

dispatch_get_specific(const void *key);

現在の場合

ラベルとキューに固有のラベルの一方または両方を設定する必要があります。たとえば、それを作成するとき

dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);

または特定のセッターを使用する

dispatch_queue_set_specific(dispatch_queue_t queue, const void *key,
    void *context, dispatch_function_t destructor);
于 2014-04-22T13:15:10.520 に答える
2

答えの最初の部分:あなたは何をしようとしていますか?なぜキューを比較する必要があるのですか?キューに特定のメタデータを「タグ付け」するだけの場合は、代わりにdispatch_queue_ {set、get} _specific()を使用することを検討してください。

回答の2番目の部分:dispatch_get_current_queue()を何にも使用しないでください。これはデバッグを目的としたものであり、その使用は常に推奨されていません。

于 2012-09-27T02:00:32.527 に答える
1

これは、現在のキューによって異なります。この特定のケースでは、以下を使用します。

if ([NSThread isMainThread]) {}

一般に、dispatch_get_current_queue()どのキューにいるのかをテストするために使用できます。その場合、==演算子を使用してこれを行うことができます。Appleの並行性プログラミングガイドのディスパッチキューページを引用するには:

デバッグ目的または現在のキューのIDをテストするために、dispatch_get_current_queue関数を使用します。ブロックオブジェクト内からこの関数を呼び出すと、ブロックが送信された(そして現在実行されていると思われる)キューが返されます。ブロックの外側からこの関数を呼び出すと、アプリケーションのデフォルトの同時キューが返されます。

于 2012-09-26T18:18:16.927 に答える