dispatch_syncを使用してブロックを実行していますが、ブロックは正しく実行されています。ただし、このブロックはメインスレッドで実行されます。Apple Docによると:
シリアルキュー(プライベートディスパッチキューとも呼ばれます)は、キューに追加された順序で一度に1つのタスクを実行します。現在実行中のタスクは、ディスパッチキューによって管理される個別のスレッド(タスクごとに異なる可能性があります)で実行されます。
これは、実行されている現在のプロセスが別のスレッドで実行されることを意味します(または私が理解したこと)。
以下は、何が起こっているのかを判断するために使用しているコードです。NSURLConnectionのdidReceiveData:デリゲートメソッド内で呼び出されています(didReceiveData:デリゲートメソッド内でこれを行うべきではないことはわかっていますが、これはdispatch_syncに焦点を当てたサンプルにすぎません)。以下は、私の結論の証拠として私が想定できるさまざまな方法です。
グローバル並行キューでのdispatch_syncの使用
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ if ([NSThread isMainThread]) { NSLog(@"Main Thread"); } else NSLog(@"Not on Main Thread"); //Some Process });
出力-
Main Thread
Main Thread
Main Thread
// Main Thread printed till didReceiveData: gets called
dispatch_queue_createを使用して自己作成キューでdispatch_syncを使用する
// Create queue somewhere else like this dispatch_queue_t newQueue = dispatch_queue_create("WriteQueue", DISPATCH_QUEUE_SERIAL); dispatch_sync(newQueue, ^{ if ([NSThread isMainThread]) { NSLog(@"Main Thread"); } else NSLog(@"Not on Main Thread"); //Some Process });
出力-
Main Thread
Main Thread
Main Thread
// Main Thread printed till didReceiveData: gets called
ここで少し驚いています。ブロックは常にメインスレッドで実行されるか、何かが足りません。Apple Docに反しているように見えるので、そう思います。誰かがこれが何であるか知っていますか?
更新:他の議論と同様に、dispatch_syncが同じスレッドでブロックを実行することを理解しています(ほとんどの場合)。それでは、なぜアップルドキュメントのステートメントがいくつかの点で矛盾しているのですか。アップルが「現在実行中のタスクは、ディスパッチキューによって管理される別のスレッド(タスクごとに異なる可能性があります)で実行される」と言う理由。それとも私はまだ何かが足りないのですか?