SwiftUI – UIはメインスレッド – part1

SwiftUI

SwiftUI書いてますでしょうか?
知れば知るほど、面白い仕組みが沢山ありませんか?自分のレベルがいかに低いかを実感します。

iOSのSwiftUI以前からの決まりごと

「UIはメインスレッド」で書いてねという決まりごとについて再度整理したいと思います。

頭ではわかっているんだけど、いつもなぜUIが更新されないんだぁぁってハマります。

アプリでいうメインスレッドとは

一方通行の一本道の環状道路

  • 逆走するのダメ
  • 横に並んで走るのダメ

アプリの中だと
①ボタンタップ -> ②状態変更 -> ③画面更新
という順番で処理が流れます。

・逆走するのダメ 
必ず処理の順序は守られる。
1回だけボタンタップした場合、③画面更新の後に、①ボタンタップが動くことはない。

・横に並んで走るのダメ
処理が重なることはない。
1回だけボタンタップした場合、①ボタンタップ中に③状態変更が動くことはない。

あえて1回だけボタンタップと記載しましたが、連続で2回ボタンタップされた場合は1回目のボタンタップが完了するまで、2回目ボタンタップは待ちになります。

いいことだらけだが、1本道なのでメインスレッドで沢山の処理をさせると渋滞します。
よく発生するのが画面が固まるなど。

簡単な決まりごとですが、スバラシイ仕組みだと思いませんか?

SwiftUIスレッドセーフじゃない

スレッドセーフって難しい言葉ですが、
UIはメインスレッドでお願いって言っているだけで、SwiftUIは何もしていないってことですね。

メインスレッドで動かさないと、どうなるかわからないよって言ってます。

バックグラウンドスレッドで、ボタンタップ -> 状態変更 -> 画面更新 という処理を実行
別のバックグラウンドスレッドで、ボタンタップ -> 状態変更 -> 画面更新 という処理を実行
すると、処理が不安定になったり、クラッシュする場合があります。

100人ぐらいの伝言ゲームで、「明日、〇〇に集合」って伝えてる途中に、
知らない人が割り込んできて「明日、お休み」って言われたら、間違ってこない人が発生してしまいますよね。

SwiftUIで制御すると遅くなるとかそういう理由があるから、あえて制御していないんだと思います。

コメント

タイトルとURLをコピーしました