##GCDとは
GCD(Dispatch)はGrand Central Dispatch の略で、DipatchQueueに処理を投入することで、コードを同時実行することができます。
##DispatchQueueとは
GCDのキューはディスパッチキューといいます。キューに行いたい処理をクロージャで渡し実行します。ディスパッチキューの実行方式には以下があります。
直列→他のスレッド終了を待機し、完了後タスク処理を実行します。
並列→他のスレッド処理を待機せず、タスク処理を同時実行します。
##キューの取得
GCDには既存のディスパッチキューとして以下の2つがあります。
mainQueue :
mainQueueはメインスレッドでタスクを実行する直列キューです。
iOSやmacOSのアプリケーションにおいては、UIの更新処理は常にmainQueueで行われます。なので、他のQueueで実行した処理の結果をUIに反映させるにはmainQueueを呼び出してタスクを渡す必要があります。
globalQueue:
システム全体で共有される並列キュー。実行優先度(Qos)を指定して取得。Qosは優先度の高い順に次の5種類があります。
###使用例
####DispatchQueue.main.sync
⇨ 直列キューなので処理は順番に実行される。またsyncなので、タスク終了まで次の処理に進みません。
DispatchQueue.main.async {
for i in 0 ... 5 {
print("DispatchQueue.main.async ",i)
}
}
print("finish")
---------
DispatchQueue.main.async 0
DispatchQueue.main.async 1
DispatchQueue.main.async 2
DispatchQueue.main.async 3
finish
####DispatchQueue.main.async
⇨直列キューなので処理は順番に実行される。asyncなので、タスクをキューに追加したら次の処理に進みます。
DispatchQueue.main.async {
for i in 0 ... 5 {
print("DispatchQueue.main.async ",i)
}
}
print("finish")
---------
finish
DispatchQueue.main.async 0
DispatchQueue.main.async 1
DispatchQueue.main.async 2
DispatchQueue.main.async 3
####DispatchQueue.global.sync
⇨ 並列に実行するので、実行順は保証されません。またsyncなので、タスク終了まで次の処理に進みません。
DispatchQueue.global().sync {
for i in 0 ... 3 {
print("DispatchQueue.global.async1 ",i)
}
}
print("finish1")
DispatchQueue.global().sync {
for i in 0 ... 3 {
print("DispatchQueue.global.async2 ",i)
}
}
print("finish2")
----
DispatchQueue.global.async1 0
DispatchQueue.global.async1 1
DispatchQueue.global.async1 2
DispatchQueue.global.async1 3
finish1
DispatchQueue.global.async2 0
DispatchQueue.global.async2 1
DispatchQueue.global.async2 2
DispatchQueue.global.async2 3
finish2
####DispatchQueue.global.async
⇨並列に実行するので、実行順は保証されません。asyncなので、タスクをキューに追加したら次の処理に進みます。
DispatchQueue.global().async {
for i in 0 ... 3 {
print("DispatchQueue.global.async1 ",i)
}
}
print("finish1")
DispatchQueue.global().async {
for i in 0 ... 3 {
print("DispatchQueue.global.async2 ",i)
}
}
print("finish2")
----
finish1
finish2
DispatchQueue.global.async1 0
DispatchQueue.global.async2 0
DispatchQueue.global.async1 1
DispatchQueue.global.async2 1
DispatchQueue.global.async1 2
DispatchQueue.global.async2 2
DispatchQueue.global.async1 3
DispatchQueue.global.async2 3
##キューの生成
GCDには既存のディスパッチキューだけでなく、新規のディスパッチを生成することができます。このキューは並列、直列どちらでも作成することができます。
##終わりに
終わりです。随時更新します