Swift Dispatchメモ

# Dispatch

```
Execute code concurrently on multicore hardware 
by submitting work to dispatch queues managed by the system.
```

システムで管理されているディスパッチキューに作業を送信して、マルチコアハードウェア上でコードを同時に実行します。

# 概要
```
Dispatch comprises language features, runtime libraries, and system enhancements 
that provide systemic, comprehensive improvements 
to the support for concurrent code execution on multicore hardware in macOS, iOS, watchOS, and tvOS.
```

ディスパッチは、言語機能、ランタイムライブラリ、およびmacOS、iOS、watchOS、およびtvOSのマルチコアハードウェアでの同時コード実行のサポートに対する体系的で包括的な改善を提供するシステムの機能強化で構成されています。

```
The BSD subsystem, Core Foundation, and Cocoa APIs have all been extended to use these enhancements 
to help both the system and your application to run faster, more efficiently, and with improved responsiveness. 
```
BSDサブシステム、Core Foundation、およびCocoa APIはすべて、これらの機能強化を使用してシステムとアプリケーションの両方をより速く、より効率的に、そして応答性を向上させて実行できるように拡張されました。

```
Consider how difficult it is for a single application to use multiple cores effectively,
 let alone doing it on different computers with different numbers of computing cores or in an environment with multiple applications competing for those cores. 
```
1つのアプリケーションで複数のコアを効果的に使用することが困難であることを考慮してください。コンピューティングコアの数が異なる別のコンピュータで、またはこれらのコアを競合する複数のアプリケーションがある環境ではもちろんです。

```
GCD, operating at the system level, can better accommodate the needs of all running applications, matching them to the available system resources in a balanced fashion.
```
システムレベルで動作するGCDは、実行中のすべてのアプリケーションのニーズに、より適切に対応し、それらを利用可能なシステムリソースとバランスの取れた方法で対応させることができます。

# Topics
## Managing Dispatch Queues(ディスパッチキューの管理)

```
GCD provides and manages FIFO queues to which your application can submit tasks in the form of block objects. 
```
GCDは、アプリケーションがブロックオブジェクトの形式でタスクを送信できるFIFOキューを提供および管理します。

```
Work submitted to dispatch queues are executed on a pool of threads fully managed by the system. No guarantee is made as to the thread on which a task executes.
```
ディスパッチキューに送信された作業は、システムによって完全に管理されているスレッドのプールで実行されます。タスクが実行されるスレッドについては保証されません。

## Synchronous and Asynchronous Execution (同期および非同期実行)
```
Each work item can be executed either synchronously or asynchronously. When a work item is executed synchronously with the sync method, the program waits until execution finishes before the method call returns. 
When a work item is executed asynchronously with the async method, the method call returns immediately.
```
各作業項目は、同期的または非同期的に実行できます。作業項目がsyncメソッドと同期して実行されると、プログラムは実行が終了するまで待機してからメソッド呼び出しが返されます。
作業項目がasyncメソッドと非同期的に実行されると、メソッド呼び出しは直ちに戻ります。

## Serial and Concurrent Queues
```
A dispatch queue can be either serial, so that work items are executed one at a time, or it can be concurrent, so that work items are dequeued in order, but run all at once and can finish in any order. 
Both serial and concurrent queues process work items in first in, first-out (FIFO) order.
```
ディスパッチキューは、作業項目が一度に1つずつ実行されるようにシリアルにすることも、作業項目が順番にデキューされるように同時実行することもできますが、一度にすべて実行して任意の順序で終了できます。

## System-Provided Queues(システム提供キュー)
```
When an app launches, the system automatically creates a special queue called the main queue. Work items enqueued to the main queue execute serially on your app’s main thread. You can access the main queue using the main type property.
```
アプリが起動すると、システムは自動的にメインキューと呼ばれる特別なキューを作成します。メインキューにエンキューされた作業項目は、アプリケーションのメインスレッドでシリアルに実行されます。 main typeプロパティを使ってメインキューにアクセスできます。

### 重要
```
Attempting to synchronously execute a work item on the main queue results in dead-lock.
```
メインキューで作業項目を同期的に実行しようとすると、デッドロックが発生します。

```
In addition to the serial main queue, the system also creates a number of global concurrent dispatch queues. You can access the global concurrent queue that best matches a specified quality of service (QoS) using the global(attributes:) type method.
```
シリアルメインキューに加えて、システムは多数のグローバル同時ディスパッチキューも作成します。 global（attributes :)型メソッドを使用すると、指定したQuality of Service（QoS）に最も一致するグローバルコンカレントキューにアクセスできます。

#### class DispatchQueue
```
DispatchQueue manages the execution of work items. Each work item submitted to a queue is processed on a pool of threads managed by the system.
```
DispatchQueueは作業項目の実行を管理します。キューに送信された各作業項目は、システムによって管理されるスレッドのプールで処理されます。

#### struct DispatchQueue.Attributes
説明無し

#### class DispatchSpecificKey
```
DispatchSpecificKey is a class that encapsulates keys that can be associated with a contextual value on a DispatchQueue using the setSpecific<T>(key:value:) method, and accessed using the getSpecific<T>(key:) method.
```

DispatchSpecificKeyは、setSpecific <T>（key：value：）メソッドを使用してDispatchQueueのコンテキスト値に関連付けることができ、getSpecific <T>（key :)メソッドを使用してアクセスできるキーをカプセル化するクラスです。

#### enum DispatchQueue.AutoreleaseFrequency
説明無し

#### func setTarget(queue: DispatchQueue?)
```
Sets the target queue for the given object.
```
指定したオブジェクトのターゲットキューを設定します。

#### func dispatchMain() -> Neve
```
Executes blocks submitted to the main queue.
```

メインキューに送信されたブロックを実行します。

## Managing Units of Work(作業単位の管理)

```
Work items allow you to configure properties of individual units of work directly. They also allow you to address individual work units for the purposes of waiting for their completion, getting notified about their completion, and/or canceling them.
```
作業項目を使用すると、個々の作業単位のプロパティを直接設定できます。
また、完了を待ったり、完了について通知を受けたり、キャンセルしたりする目的で、個々の作業単位に対処することもできます。

#### class DispatchWorkItem
```
DispatchWorkItem encapsulates work that can be performed. A work item can be dispatched onto a DispatchQueue and within a DispatchGroup. A DispatchWorkItem can also be set as a DispatchSource event, registration, or cancel handler.
```

DispatchWorkItemは実行可能な作業をカプセル化します。作業項目は、DispatchQueueおよびDispatchGroup内にディスパッチできます。 DispatchWorkItemは、DispatchSourceイベント、登録、またはキャンセルハンドラとして設定することもできます。

#### struct DispatchWorkItemFlags
```
DispatchWorkItemFlags are an option set that configure the behavior of a 
DispatchWorkItem
 value, including its quality of service class and whether to create a barrier or spawn a new detached thread.
```

DispatchWorkItemFlagsは、の動作を設定するオプションセットです。 DispatchWorkItem  そのサービス品質クラス、およびバリアを作成するか、新しい独立スレッドを生成するかなどの価値。

## Prioritizing Work and Specifying Quality of Service(作業の優先順位付けとサービス品質の指定)
#### struct DispatchQoS
```
DispatchQoS encapsulates quality of service classes.
```
DispatchQoSはサービス品質クラスをカプセル化します。

#### enum DispatchQoS.QoSClass
```
DispatchQoS.QoSClass encapsulates quality of service classes.
```
DispatchQoS.QoSClassはQuality of Serviceクラスをカプセル化します。

#### Dispatch Queue Priorities
```
Used to select the appropriate global concurrent queue.
```
適切なグローバル並行キューを選択するために使用されます。

## Using Dispatch Groups(ディスパッチグループの使用)
```
Grouping blocks allows for aggregate synchronization. Your application can submit multiple blocks and track when they all complete, even though they might run on different queues. 
This behavior can be helpful when progress can’t be made until all of the specified tasks are complete.
```
ブロック化したブロックは、集約同期を可能にします。アプリケーションは複数のブロックを送信し、それらが異なるキューで実行されている場合でも、それらがすべて完了した時点を追跡できます。
この動作は、指定されたすべてのタスクが完了するまで処理を進められない場合に役立ちます。

#### class DispatchGroup

```
DispatchGroup allows for aggregate synchronization of work. You can use them to submit multiple different work items and track when they all complete, even though they might run on different queues. This behavior can be helpful when progress can’t be made until all of the specified tasks are complete.
```

DispatchGroupは作業の集約同期を可能にします。それらを使用して、複数の異なる作業項目を送信し、それらがすべて別のキューで実行されている場合でも、それらがすべて完了した時点を追跡できます。
の動作は、指定されたすべてのタスクが完了するまで処理を進められない場合に役立ちます。

## Using Dispatch Semaphores(ディスパッチセマフォの使用)
```
A dispatch semaphore is an efficient implementation of a traditional counting semaphore. Dispatch semaphores call down to the kernel only when the calling thread needs to be blocked. If the calling semaphore does not need to block, no kernel call is made.
```
ディスパッチセマフォは、従来のカウントセマフォの効率的な実装です。
ディスパッチセマフォは、呼び出し側のスレッドをブロックする必要がある場合にのみ、カーネルに呼び出します。呼び出し元のセマフォがブロックする必要がない場合は、カーネル呼び出しは行われません。

#### class DispatchSemaphore

```
DispatchSemaphore provides an efficient implementation of a traditional counting semaphore, which can be used to control access to a resource across multiple execution contexts.
```
DispatchSemaphoreは、複数の実行コンテキストにわたるリソースへのアクセスを制御するために使用できる、従来のカウントセマフォの効率的な実装を提供します。

## Using Dispatch Data()
#### struct DispatchData
```
DispatchData objects manage a memory-based data buffer. The data buffer is exposed as a contiguous block of memory, but internally, it may be comprised of multiple, discontiguous blocks of memory.
```
DispatchDataオブジェクトは、メモリベースのデータバッファを管理します。データバッファは連続したメモリブロックとして公開されていますが、内部的には複数の連続していないメモリブロックで構成されている場合があります。

#### struct DispatchDataIterator

#### enum DispatchData.Deallocator

## Using Dispatch Time
#### struct DispatchTime
```
DispatchTime represents a point in time relative to the default clock with nanosecond precision. On Apple platforms, the default clock is based on the Mach absolute time unit.
```

DispatchTimeは、デフォルトのクロックを基準としたナノ秒の精度の時点を表します。
Appleプラットフォームでは、デフォルトの時計はマッハの絶対時間単位に基づいています。

#### Dispatch Time Constants
```
Base time constants.
```
基本時定数

#### struct DispatchWallTime
```
DispatchTime represents an absolute point in time according to the wall clock with microsecond precision. On Apple platforms, the default clock is based on the result of gettimeofday(2).
```

DispatchTimeは、壁時計に従った絶対的な時点をマイクロ秒の精度で表します。 Appleプラットフォームでは、デフォルトの時計はgettimeofday（2）の結果に基づいています。

#### enum DispatchTimeInterval
```
DispatchTimeInterval represents a number of seconds, millisconds, microseconds, or nanoseconds. You use DispatchTimeInterval values to specify the interval at which a 
DispatchSourceTimer
 fires or I/O handlers are invoked for a 
DispatchIO
 channel, as well as to increment and decrement 
DispatchTime
 values.
```

DispatchTimeIntervalは、秒数、ミリ秒数、マイクロ秒数、またはナノ秒数を表します。
DispatchTimeInterval値を使用して、間隔を指定します。 DispatchSourceTimer  のために起動またはI / Oハンドラが呼び出されます。 DispatchIO  インクリメントおよびデクリメント 発送時期  値

#### enum DispatchTimeoutResult
```
DispatchTimeoutResult indicates whether a dispatch operation finised before a specified time.
```
DispatchTimeoutResultは、指定された時間の前にディスパッチ操作が終了したかどうかを示します。

#### typealias dispatch_time_t
```
A somewhat abstract representation of time.
```
やや抽象的な時間の表現。