web-dev-qa-db-ja.com

グランドセントラルディスパッチ非同期vs同期

GCDのディスパッチキューに関するドキュメントを読んでいますが、キューはFIFOであると書かれているので、これが非同期/同期ディスパッチにどのような影響を与えるのでしょうか。

私の理解では、非同期は物事を取得する順序で実行し、同期は物事をシリアルに実行します。

しかし、GCDコードを書くときは、物事が起こる順序を決定します。コードで何が起こっているかを知っている限り、物事が実行される順序を知っている必要があります。

私の質問は、ここで非同期の利点はどこにありますか?私はこれらの2つのことを理解する上で何かが欠けていますか?.

29
C.Johns

syncは、関数が完了するまで現在のスレッドをブロックすることを意味し、asyncは、バックグラウンドで処理され、関数が現在のスレッドをブロックしないことを意味します。

ブロックのシリアル実行が必要な場合は、シリアルディスパッチキューの作成を確認してください

19
Tony Million

残念ながら、最初の答えは完全ではありません。はい、同期はブロックされ、非同期はブロックされませんが、考慮すべき追加のセマンティクスがあります。また、dispatch_sync()を呼び出すと、そのキュー上のすべての保留中のアイテムの実行が終了するまでコードが待機し、その作業の同期ポイントになります。 dispatch_async()は単に作業をキューに送信し、すぐに戻ります。その後、「ある時点で」実行され、他の方法でその作業の完了を追跡する必要があります(通常、1つのdispatch_asyncを別のdispatch_async内にネストします。たとえば、manページ)。

32
jkh

マニュアルページから:

[〜#〜]基本[〜#〜]

Conceptually, dispatch_sync() is a convenient wrapper around
dispatch_async() with the addition of a semaphore to wait for completion
of the block, and a wrapper around the block to signal its completion.
See dispatch_semaphore_create(3) for more information about dispatch sem-
aphores. The actual implementation of the dispatch_sync() function may be
optimized and differ from the above description.
8
Anonymous

タスクは同期的または非同期的に実行できます。

同期関数は、タスクが終了した後にのみ、現在のキューの制御を返します。キューをブロックし、タスクが終了するまで待機します。

非同期関数は、タスクが送信されて別のキューで実行された直後に、現在のキューの制御を返します。タスクが終了するまで待機しません。キューをブロックしません。

非同期でのみ、delay-> asyncAfter(deadline: 10..を追加できます。

5
Vinoth Anandan

GCDを使用すると、synchronouslyまたはasynchronouslyのいずれかでタスクをディスパッチできます。

synchronous関数は、タスクの完了後に呼び出し元に制御を返します。 DispatchQueue.sync(execute:)を呼び出すことにより、作業単位を同期的にスケジュールできます。

asynchronous関数はすぐに戻り、タスクの開始を命令しますが、タスクが完了するのを待ちません。したがって、非同期関数は、現在の実行スレッドが次の関数に進むのをブロックしません。 DispatchQueue.async(execute:)を呼び出すことにより、作業単位を非同期的にスケジュールできます。

続きを読む ここ
ソースは ここ

1
yoAlex5