題意
DispatchQueue.main.asyncにおいて、なぜメインスレッド指定なのに、非同期に実行させているのか不明だったので調査してみた。
結果
DispatchQueue.main.syncは呼び出し元のスレッドでの処理にキューとしてつみあげられる。バックグラウンドスレッドでDispatchQueue.main.syncを実行するとバックグラウンドスレッドのキューに積み上げられてしまうイメージ。下記のような実行順序になる。
DispatchQueue.global().async {
// 一番目に実行
DispatchQueue.main.sync {
// syncなので呼び出し元のスレッドでの処理が終了したときに呼ばれる
// 二番目に実行
}
// 三番目に実行
}
しかしDisoatchQueue.main.asyncで呼ぶと呼び出し元のスレッドの処理と同時に非同期処理が行われるようになる。
DispatchQueue.global().async {
// 一番目に実行
DispatchQueue.main.async {
// asyncなので呼び出し元のスレッドでの処理と並行して処理がよばれる
// 二番目に実行
}
// 二番目に実行(ここでの処理はDispatchQueue.main.asyncの中の処理と同じタイミングで走る)
}
だから、asyncを呼ぶときはローディング画面の表示など、バックグラウンドでの処理と並行して呼びたいときに使われるらしい