2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Swift】GCDについて

Posted at

##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には既存のディスパッチキューだけでなく、新規のディスパッチを生成することができます。このキューは並列、直列どちらでも作成することができます。

##終わりに
終わりです。随時更新します

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?