GCDのディスパッチキューに関するドキュメントを読んでいますが、キューはFIFOであると書かれているので、これが非同期/同期ディスパッチにどのような影響を与えるのでしょうか。
私の理解では、非同期は物事を取得する順序で実行し、同期は物事をシリアルに実行します。
しかし、GCDコードを書くときは、物事が起こる順序を決定します。コードで何が起こっているかを知っている限り、物事が実行される順序を知っている必要があります。
私の質問は、ここで非同期の利点はどこにありますか?私はこれらの2つのことを理解する上で何かが欠けていますか?.
syncは、関数が完了するまで現在のスレッドをブロックすることを意味し、asyncは、バックグラウンドで処理され、関数が現在のスレッドをブロックしないことを意味します。
ブロックのシリアル実行が必要な場合は、シリアルディスパッチキューの作成を確認してください
残念ながら、最初の答えは完全ではありません。はい、同期はブロックされ、非同期はブロックされませんが、考慮すべき追加のセマンティクスがあります。また、dispatch_sync()を呼び出すと、そのキュー上のすべての保留中のアイテムの実行が終了するまでコードが待機し、その作業の同期ポイントになります。 dispatch_async()は単に作業をキューに送信し、すぐに戻ります。その後、「ある時点で」実行され、他の方法でその作業の完了を追跡する必要があります(通常、1つのdispatch_asyncを別のdispatch_async内にネストします。たとえば、manページ)。
マニュアルページから:
[〜#〜]基本[〜#〜]
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.
タスクは同期的または非同期的に実行できます。
同期関数は、タスクが終了した後にのみ、現在のキューの制御を返します。キューをブロックし、タスクが終了するまで待機します。
非同期関数は、タスクが送信されて別のキューで実行された直後に、現在のキューの制御を返します。タスクが終了するまで待機しません。キューをブロックしません。
非同期でのみ、delay-> asyncAfter(deadline: 10..
を追加できます。
GCDを使用すると、synchronously
またはasynchronously
のいずれかでタスクをディスパッチできます。
synchronous
関数は、タスクの完了後に呼び出し元に制御を返します。 DispatchQueue.sync(execute:)
を呼び出すことにより、作業単位を同期的にスケジュールできます。
asynchronous
関数はすぐに戻り、タスクの開始を命令しますが、タスクが完了するのを待ちません。したがって、非同期関数は、現在の実行スレッドが次の関数に進むのをブロックしません。 DispatchQueue.async(execute:)
を呼び出すことにより、作業単位を非同期的にスケジュールできます。