SwiftUI書いてますでしょうか?
知れば知るほど、面白い仕組みが沢山ありませんか?自分のレベルがいかに低いかを実感します。
iOSのSwiftUI以前からの決まりごと
「UIはメインスレッド」で書いてねという決まりごとについて再度整理したいと思います。
頭ではわかっているんだけど、いつもなぜUIが更新されないんだぁぁってハマります。
アプリでいうメインスレッドとは
一方通行の一本道の環状道路
- 逆走するのダメ
- 横に並んで走るのダメ
アプリの中だと
①ボタンタップ -> ②状態変更 -> ③画面更新
という順番で処理が流れます。
・逆走するのダメ
必ず処理の順序は守られる。
1回だけボタンタップした場合、③画面更新の後に、①ボタンタップが動くことはない。
・横に並んで走るのダメ
処理が重なることはない。
1回だけボタンタップした場合、①ボタンタップ中に③状態変更が動くことはない。
あえて1回だけボタンタップと記載しましたが、連続で2回ボタンタップされた場合は1回目のボタンタップが完了するまで、2回目ボタンタップは待ちになります。
いいことだらけだが、1本道なのでメインスレッドで沢山の処理をさせると渋滞します。
よく発生するのが画面が固まるなど。
簡単な決まりごとですが、スバラシイ仕組みだと思いませんか?
SwiftUIスレッドセーフじゃない
スレッドセーフって難しい言葉ですが、
UIはメインスレッドでお願いって言っているだけで、SwiftUIは何もしていないってことですね。
メインスレッドで動かさないと、どうなるかわからないよって言ってます。
バックグラウンドスレッドで、ボタンタップ -> 状態変更 -> 画面更新 という処理を実行
別のバックグラウンドスレッドで、ボタンタップ -> 状態変更 -> 画面更新 という処理を実行
すると、処理が不安定になったり、クラッシュする場合があります。
100人ぐらいの伝言ゲームで、「明日、〇〇に集合」って伝えてる途中に、
知らない人が割り込んできて「明日、お休み」って言われたら、間違ってこない人が発生してしまいますよね。
SwiftUIで制御すると遅くなるとかそういう理由があるから、あえて制御していないんだと思います。

コメント