DispatchGroupの挙動を理解したい

まず基礎から。どっちがどっちだったか、うっかり忘れがちな私です。

 

同期

処理の完了を"待つ"

GCDのメソッドはsync〜

 

非同期

処理の完了を"待たない"

GCDのメソッドはasync〜

 

正直、ここが自分の頭になかなか入ってこなくて理解を阻んでいる気がします。

 

シンクロでしょ?同時に動くんでしょ?非同期じゃないの?という感覚があります。

同期 非同期 シンクロ などいろんな言葉で検索したのですが、あまり気持ちの良い結論は得られませんでした。Wikipediaによれば

シンクロとは英語 synchronize 同期する、タイミングをあわせる、同時に起こる」 に由来する語で、英語 sync に相当する略語。 「シンクロする」のように動詞として使うほか、次の意味をもつ。

という記載がありまして、"タイミングをあわせる"のほうだと解釈すればいいのかもしれませんね。

 

サンプルコード

以下のサンプルコードをほぼそのまま使わせて頂きました。ランダムの計算式だけ少し変えています。

https://qiita.com/shtnkgm/items/d9b78365a12b08d5bde1

f:id:NNkamura_Enginieer:20191125064008p:plain

並列処理のサンプルコード

f:id:NNkamura_Enginieer:20191125064519p:plain

並列処理のサンプルログ


sleepTimeから、#5,#3,#2,#1,#4 という順番で終わるかなと予想したのですが,#4,#2,#3,#1,#5でした。また、なんで"#2 Start"が最初なの?とか色々思うところがあるのですが、結論は出ません。

少なくともサンプルで行いたかったAll Process Done!は最後に来ていますね。

 

DispatchGroupの公式文章も読んでみましたが、参考資料で書いてある通りっぽいな…という結論で終わってしまいました。

f:id:NNkamura_Enginieer:20191125064719p:plain

直列処理のサンプルソース

f:id:NNkamura_Enginieer:20191125064738p:plain

直列処理のサンプルログ

順番に処理が終わっています。なるほど。

 

使い方としてはこんなところで、仕組みを理解するのに良さそうなサイトがありました。

https://dev.classmethod.jp/smartphone/iphone/gcd_swift/

この手の処理で陥りがちなDead LockやUI描画といった問題にも触れてあって良いですね。

また、こちらもかなり詳しく書いています。

https://qiita.com/shiz/items/693241f41344a9df6d6f

ちょっと自分も飲み込みきれていないので、時間ある時に再度読み直したいと思います。今日はここまでにしたいと思います。

 

 

今回のソースはこちらになります。

https://github.com/NNkamura/DispatchQueue_training