10

私はいくつかのスレッドセーフなメソッドを書き込もうとしているので、以下を使用しています:

...
dispatch_queue_t main = dispatch_get_main_queue();
dispatch_sync(main,^{
  [self doSomethingInTheForeground];
});
...

しかし、私が必要のないメインスレッドにいて、それらのディスパッチ呼び出しをすべてスキップできる場合は、現在どのスレッドにいるのか知りたいです。どうすればこれを知ることができますか?

または、おそらくそれは(パフォーマンスに)違いをもたらさないのでしょうか?

この比較をしても大丈夫ですか?

if (dispatch_get_main_queue() == dispatch_get_current_queue()){...}
4

9 に答える 9

13

更新された回答:

Apple ドキュメントが変更され、「サブミットされたブロックのコンテキスト外から呼び出された場合、この関数はメイン スレッドから呼び出しが実行された場合、メイン キューを返します。呼び出しが他のスレッドから行われた場合、この関数は戻り値を返します。デフォルトの同時キューです。」そのため、チェックが機能するdispatch_get_main_queue() == dispatch_get_current_queue()はずです。

元の答え:

使用してdispatch_get_main_queue() == dispatch_get_current_queue()もうまくいきません。dispatch_get_current_queue「送信されたブロックのコンテキスト外で呼び出された場合、この関数はデフォルトの同時キューを返します」と言うドキュメント。デフォルトの同時キューはメイン キューではありません。

[NSThread isMainThread]あなたが望むもののために働くべきです。ただし、メイン スレッドから[NSThread isMainThread]呼び出す場合など、メイン キュー以外のキューにも当てはまることに注意してください。dispatch_sync

于 2011-02-11T01:25:20.127 に答える
4

更新された回答:

dispatch_get_current_queue()は非推奨になりました。

元の答え:

OS-X 10.8では、ヘッダーファイル(queue.h)のdispatch_get_current_queue()関数の上のコメントに次のように記述されています。

メインスレッドでdispatch_get_current_queue()が呼び出されると、dispatch_get_main_queue()と同じ値が返される場合と返されない場合があります。2つを比較することは、コードがメインスレッドで実行されているかどうかをテストするための有効な方法ではありません。

私はそれを発見しました

assert(dispatch_get_current_queue() == dispatch_get_main_queue());

私のコードでは、iOSではうまく機能しますが、OS-Xでは失敗します。

于 2012-11-23T20:04:31.690 に答える
2

Objective-C を使用していて、メイン スレッドで同期的に何かを実行したい場合、使用する方が簡単ではないでしょうか。

[self performSelectorOnMainThread: @selector(doSomethingInTheForeground) 
                       withObject: nil 
                    waitUntilDone: YES];

これには、既にメイン スレッドを使用している場合でも問題なく、メッセージが通常の方法で送信されるという利点があります。

于 2011-02-09T09:06:55.700 に答える
1

dispatch_get_current_queue()デバッグしていない場合を除いて、使用するのは安全ではありません。マニュアルページに明確に書かれているdispatch_queueように:

警告

コードは、によって返されるキューについて想定することはできませんdispatch_get_current_queue()。返されるキューには、キューでの作業をスケジュールしようとするコードを驚かせる可能性のある任意のポリシーが含まれている可能性があります。ポリシーのリストには、キュー幅(つまり、シリアルとコンカレント)、スケジューリングの優先度、セキュリティクレデンシャル、またはファイルシステム構成が含まれますが、これらに限定されません。したがって、dispatch_get_current_queue()IDテストまたはデバッグにのみ使用する必要があります。

より良いこと(より複雑かもしれません)は、バックグラウンドスレッドを同期することです:

dispatch_sync(backgroundqueue,^{
  [self doSomethingInTheBackground];
});

たぶん私は完全に間違っていますが、それが私が提案することです。

于 2011-02-09T08:57:54.100 に答える
0

実際、使ってOKです。

ドキュメントによると

サブミットされたブロックのコンテキスト外から呼び出された場合、メイン スレッドから呼び出しが実行された場合、この関数はメイン キューを返します。呼び出しが他のスレッドから行われた場合、この関数はデフォルトの同時キューを返します。

于 2011-10-24T21:11:07.563 に答える
-1

dispatch_get_current_queueiOS 6.0 で廃止されました。[NSThread isMainThread]行く唯一の方法のように見えます。

于 2013-08-27T19:08:55.530 に答える