カルボナーラ街道

計測と観察

Swift Concurrency メインスレッドクイズ 5問

実行環境

>swift --version
swift-driver version: 1.90.11.1 Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4)
Target: arm64-apple-macosx14.0

>xcodebuild -version
Xcode 15.3
Build version 15E204a

モチベーション

コードレビューをしている時に、viewWillTransition(to:with:)内で行う表示関係の処理はそのメソッド自体がメインスレッドで呼ばれるから、明にメインスレッドでやるように書かなくても良いのでは?という話題があった。その時は根拠が無くて体感レベルの理解だったが、体感でコードを書きたくないので、id:maiyama4 の以下の記事や各種プロポーザルを見て理解を深めた。

zenn.dev

知識の定着のために、Thread.isMainThread の値がどうなるかのクイズを5問作ったので解いてみてほしい。

Question 1

gist.github.com

答えと解説

答え

true

解説

Question 2

gist.github.com

答えと解説

答え

true

解説

Question 3

gist.github.com

答えと解説

答え

false

解説

Question 4

gist.github.com

答えと解説

答え

false

解説

Question 5

gist.github.com

答えと解説

答え

true

解説

おわりに

Question 4については先週の自分だったら答えと解説をセットで答えられなかった。難しい、というか実行されるActorの意識が無かった。また、メインスレッドで実行したい関数はTask側でMainActorを指定するのではなくて、関数自体 or そのメソッドを持つクラスや構造体に指定した方が良さそう。なぜなら、呼び出し先がasync functionならActorを引き継がないため、呼び出し元でメインスレッドで実行するかどうかを考えなくて済むから。